队列,先进先出
#include
queue<typename> name;
限制性数据结构,只能通过front()来访问队首元素,back()来访问队尾元素,时间复杂度为O(1)
void queueTest() {
queue<int> q;
for (int i = 1;i <= 5;i++) {
q.push(i);
}
if (q.empty() != true) {
cout << "队首元素:" << q.front() << endl;
cout << "队尾元素:" << q.back() << endl;
cout << "st的元素个数:" << q.size() << endl;
}
//栈顶元素出栈
for (int i = 1;i < 3;i++) {
q.pop();
}
cout << "出队一些元素后的队首元素:" << q.front() << endl;
cout << "出队一些元素后的队尾元素:" << q.back() << endl;
cout << "出队一些元素后的的元素个数:" << q.size() << endl;
}
常见用途:
1、广度优先搜索
2、在使用front()和pop()前,必须用empty()判断队列是否为空
3、另外两种跟队列有关的容器:双端队列(deque),首尾皆可插入和删除的队列;优先队列(priority_queue),使用堆实现的默认将当前队列最大元素制语队首的容器。
优先队列,底层用堆来实现。队首元素一定是当前队列中优先级最高的一个。
#include
priority_queue<typename> name;
没有front()和back(),只能通过top()来访问队首元素(堆顶元素),也是优先级最高的元素。
(1)元素越大优先级越高:priority_queue
也可以写成priority_queue
**vector< int>**是填写用来承载1底层数据结构堆(heap)的内容。
less是对第一个参数的比较类,表示元素越大优先级越大;greater表示元素越小优先级越大。
priority_queue<int, vector<int>, less<int> > q;
q.push(10);
q.push(3);
q.push(5);
q.push(12);
cout << "基本结构队首元素:" << q.top() << endl;
q.pop();
cout <<"使用pop()后的基本结构:" << q.top() << endl;
内含的结构体、重载和友元的概念不在此描述
和基本数据类型差不多,有两种定义方式
//按水果的价格,价格越小优先级越高
struct fruit
{
string name;
int price;
//重载<符号,使价格高的优先级高
/*friend bool operator < (fruit f1, fruit f2) {
return f1.price > f2.price;
}*/
}f1,f2,f3;
struct cmp {
bool operator() (fruit f1, fruit f2) {
return f1.price > f2.price;
}
};
void priority_queueTest() {
//priority_queue f;
priority_queue<fruit,vector<fruit>,cmp> f;
f1.name = "桃子";
f1.price = 10;
f2.name = "苹果";
f2.price = 8;
f3.name = "荔枝";
f3.price = 20;
f.push(f1);
f.push(f2);
f.push(f3);
cout <<"结构体:" << f.top().name<<"\t"<< f.top().price<< endl;
}
注:1、如果结构体内的数据较为庞大,可以使用引用提高效率,参数中加上“const”或“&”
friend bool operator < (const fruit &f1, const fruit &f2) {
return f1.price > f2.price;
}
bool operator() (const fruit &f1, const fruit &f2) {
return f1.price > f2.price;
}
2、在使用top()前,必须用empty()判断队列是否为空
栈,后进先出
只能通过top()来访问栈顶元素
1、定义:stack
void stackTest() {
stack<int> st;
for (int i = 1;i <= 5;i++) {
st.push(i);
}
if (st.empty() != true) {
cout << "st的栈顶元素:"<<st.top() << endl;
cout << "st的元素个数:" << st.size() << endl;
}
//栈顶元素出栈
st.pop();
cout << "st出栈后的栈顶元素:" << st.top() << endl;
cout << "st出栈后的元素个数:" << st.size() << endl;
}
常用来模拟实现一些递归,防止程序对栈内存的限制而导致程序运行出错。
当想要将两个元素绑在一起作为一个合成元素,又不想因此定义一个结构体是,可以用pair当一个替代品
使用头文件#include
,map头文件时会自动添加utility头文件,所以可以用map头文件代替utility头文件
pair<typeName1,typeName2> name;
typeName1,typeName2分别对应first和second的数据类型,可以是任意基本数据类型和容器。
有几种写法:
(1)进行初始化:pair
(2)在代码中临时构建一个pair:
将类型定义写在前面,后面用小括号内两个元素的方式:pair
使用自带的make_pair函数:make_pair(“haha”,5)
正常结构体的方式访问
void pairTest() {
pair<string, int> p;
p.first = "haha";
p.second = 5;
cout << p.first << "\t" << p.second << endl;
p = make_pair("xixi", 5);
cout << p.first << "\t" << p.second << endl;
p = pair<string, int>("heihei", 55);
cout << p.first << "\t" << p.second << endl;
}
1、比较操作数
可以直接用==、!=、<、<=、> 、>=
比较规则:先以first的大小作为标准,只有当first相等时采取判别second的大小。
pair<int, int> p1(5, 10);
pair<int, int> p2(5, 20);
pair<int, int> p3(10, 10);
if (p1 < p3) cout << "p1 << endl;
if (p1 <= p3) cout << "p1<=p3" << endl;
if (p1 < p2) cout << "p1 << endl;
常见用途:
1、用来代替二元结构体及其构造函数,节省编码时间
2、作为map的键值对进行插入
map<string, int> mp;
mp.insert(make_pair("heihei", 55));
mp.insert(pair<string, int>("haha", 10));
for (map<string, int>::iterator it = mp.begin();it != mp.end();it++) {
cout << it->first << "\t" << it->second << endl;
}
注:前面队列和栈示例中用到的函数解释:
1、push()、pop()
push():进入队列
pop():首元素出队
2、empty()
检测是否为空,返回true为空,false为非空
3、size()
返回queue内元素个数(通用)