C++STL中提供了强大的容器(containers)来替代程序中常用的数据结构,主要包括:字符串(string), 动态数组 (vector), 队列(queue), 栈 (stack), 堆 (priority_queue), 链接表 (list), 集合 (set), 字典 (map)。
使用这些容器可以极大的简化程序的编写,提高编程的效率。也是我个人更喜欢C++(相对于C而言)的重要原因。废话不多说,直接来看看各个容器中常用的操作。
1. 各容器中常用的操作
Name | vector | deque | string | queue | priority_queue | stack | list | set | map |
---|---|---|---|---|---|---|---|---|---|
empty() | 判断容器是否为空 | 有 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
size() | 返回容器的大小 | 有 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
resize() | 改变容器的大小 | 有 | 有 | 无 | 无 | 无 | 有 | 无 | 无 |
operator[] | 使用下标取值 | 有 | 有 | 无 | 无 | 无 | 无 | 无 | 有 |
front() | 访问第一个元素 | 有 | C++11 | 有 | 无 | 无 | 有 | 无 | 无 |
back() | 访问最后一个元素 | 有 | C++11 | 有 | 无 | 无 | 有 | 无 | 无 |
push_back() | 在容器末尾添加元素 | 有 | 有 | 无 | 无 | 无 | 有 | 无 | 无 |
pop_back() | 弹出容器末尾的元素 | 有 | C++11 | 无 | 无 | 无 | 有 | 无 | 无 |
push_front() | 无 | 在容器首端添加元素 | 无 | 无 | 无 | 无 | 有 | 无 | 无 |
pop_front() | 无 | 弹出容器首端的元素 | 无 | 无 | 无 | 无 | 有 | 无 | 无 |
push() | 无 | 无 | 无 | 压入元素 | 有 | 有 | 无 | 无 | 无 |
pop() | 无 | 无 | 无 | 弹出元素 | 有 | 有 | 无 | 无 | 无 |
insert() | 插入元素 | 有 | 有 | 无 | 无 | 无 | 有 | 有 | 有 |
erase() | 删除元素 | 有 | 有 | 无 | 无 | 无 | 有 | 有 | 有 |
clear() | 将容器清空 | 有 | 有 | 无 | 无 | 无 | 有 | 有 | 有 |
begin() | 返回容器首端的迭代器 | 有 | 有 | 无 | 无 | 无 | 有 | 无 | 有 |
end() | 返回容器尾端的迭代器 | 有 | 有 | 无 | 无 | 无 | 有 | 无 | 有 |
rbegin() | 反向首端反向迭代器 | 有 | 有 | 无 | 无 | 无 | 有 | 无 | 有 |
rend() | 反向尾端反向迭代器 | 有 | 有 | 无 | 无 | 无 | 有 | 无 | 有 |
此外,priority_queue中的top()
函数——取出堆中的最大(或最小)值;stack的top()
函数——访问下一个元素(最近插入栈中的元素);set和map中的count()
函数——返回某个元素出现的次数,也比较常用。
2. 容器应用的简单说明
在C++中,推荐使用vector来代替纯数组,使用string来表示字符串,deque则多用于表示增加删除特别频繁的数据(尤其是在前面——非最后一个增删数据)。queue、priority_queue、stack、set、map则用于存储特定类型的数据。
1 . 关于vector 2D数组
#include <vector>
using namespace std;
int main()
{
vector<<vector int> > v2d; // 注意,后方两个">"之间有空格
return 0; // 在实际使用中,可以用于表示图(vertex从1到N-1)
}
2 . maxheap及minheap
#include <queue>
using namespace std;
int main()
{
priority_queue<int> maxheap;
priority_queue<int, vector<int>, greater<int> > minheap;
return 0;
}
3 . map与图
如果说,2D vector在表示图时可能会因为给出的vertex并不是连续而出现一些不便,那么map的键值对则较为完美的解决了这一问题
// 一个简单示例
#include <vector>
#include <map>
#include <iostream>
using namespace std;
struct Node {
int data;
Node(int i):data(i) {}
};
int main(void)
{
map<int, vector<Node> > mv;
mv[1].push_back(Node(1)); // 插入一个与节点“1”相连的节点的相关信息
mv[1].push_back(Node(2));
for (int i = 0; i < mv[1].size(); i++)
cout<<' ' << mv[1][i].data; // 逐项输出与节点“1”相连的数据
return 0;
}
3. 参考资料
- C++reference:http://www.cplusplus.com/reference/