小结:
1)如果需要高效的随机存取,不在乎插入和删除的效率,使用vector。
2)如果需要大量的插入和删除元素,不关心随机存取的效率,使用list。
3)如果需要随机存取,并且关心两端数据的插入和删除效率,使用deque。
4)如果打算存储数据字典,并且要求方便地根据key找到value,一对一的情况使用map,一对多的情况使用multimap。
5)如果打算查找一个元素是否存在于某集合中,唯一存在的情况使用set,不唯一存在的情况使用multiset。
栈(stack)容器
该适配器中的数据以LIFO的方式组织(栈),和自助餐馆中的碟盘子类似,只有在一出了容器顶部的元素后在能访问下方元素,基本操作示意图如下:
除了上述基本操作,其还有下面几个操作:
函数原型 | 作用 |
---|---|
size() | 返回栈中元素的个数 |
empty() | 在栈中没有元素的情况下返回 true |
swap(stack & other_stack) | 将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同 |
#include <iostream>
#include <stack> //使用stack需要包含此头文件
using namespace std;
int main()
{
int n, k;
stack <int> stk;
cin >> n >> k; //将n转换为k进制数
if (n == 0) {
cout << 0;
return 0;
}
while (n) {
stk.push(n%k);
n /= k;
}
while (!stk.empty()) {
cout << stk.top();
stk.pop();
}
return 0;
}
运行结果如下:
4 2
100
queue容器
queue即队列,只能在末尾添加新元素,在头部移除元素,可联系到我们生活中的排队买票,下图所展示了该容器的一些基本操作:
queue同样和stack类似的push、pop、top函数,只不过queue的push发生在队尾,pop和top发生在队头,还有如下基本操作:
函数原型 | 作用 |
---|---|
size() | 返回 queue 中元素的个数 |
empty() | 如果 queue 中没有元素的话,返回 true |
swap(queue &other_q) | 将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素 |
#include <queue>
#include <iostream>
using namespace std;
int main()
{
queue<int> myQ;
for (int i = 0; i < 10; i++)
myQ.push(i);
cout << "myQ size is: " << myQ.size() << endl;
for (int i = 0; i < myQ.size(); i++)
{
cout << myQ.front() << endl;
myQ.pop();
}
cout << "myQ size is: " << myQ.size() << endl;
return 0;
}
运行结果如下:
myQ size is: 10
0
1
2
3
4
myQ size is: 5
priority_queue容器
即优先队列,他和普通队列的区别就是该队列的队头元素总是最大,执行pop操作时,删除的总是最大的元素,执行top操作时引用的也是最大的操作;该容器可用vector和deque实现,默认用vector,放入容器的元素必须为“<”运算符比较的,且总可保证对于队头元素x和任意非队头元素y,表达式“x<y”必为false。
函数定义如下:
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;
priority_queue<double, vector<double>, greater<double> > q;
在后面两种定义中,多出来两个参数vector<>和less<>(greater<>),第二个参数vector<>用来承载底层数据结构堆(heap);第三个参数是对第一个参数的比较类,less表示数字越大优先级越大,greater表示数字越小,优先级越大。其采用的是堆排序实现,虽然内部不是完全有序,但却总能保证最大元素在队头,因此特别适用在一堆元素中取走最大的元素。
示例代码:
#include <queue>
#include <iostream>
using namespace std;
int main()
{
priority_queue<double> pq1;
pq1.push(3.2); pq1.push(9.8); pq1.push(9.8); pq1.push(5.4);
while (!pq1.empty()) {
cout << pq1.top() << " ";
pq1.pop();
} //上面输出 9.8 9.8 5.4 3.2
cout << endl;
priority_queue<double, vector<double>, greater<double> > pq2;
pq2.push(3.2); pq2.push(9.8); pq2.push(9.8); pq2.push(5.4);
while (!pq2.empty()) {
cout << pq2.top() << " ";
pq2.pop();
}
//上面输出 3.2 5.4 9.8 9.8
return 0;
}
运行结果如下:
9.8 9.8 5.4 3.2
3.2 5.4 9.8 9.8