考试多次可以用到,但有些容器用法根本不熟练或者不知道,故总结一下
序列式容器
vector
1. 创建vector
vector<int> v;
vector<int> v(10); /指定了大小后可以使用下标操作
2. 基本操作
v.capacity(); //容器容量
v.size(); //容器大小
v.at(int idx); //用法和[]运算符相同
v.push_back(); //尾部插入
v.pop_back(); //尾部删除
v.front(); //获取头部元素
v.back(); //获取尾部元素
v.begin(); //头元素的迭代器
v.end(); //尾部元素的迭代器
v.insert(pos,elem); //pos是vector的插入元素的位置
v.insert(pos, n, elem) //在位置pos上插入n个元素elem
v.insert(pos, begin, end);
v.erase(pos); //移除pos位置上的元素,返回下一个数据的位置
v.erase(begin, end); //移除[begin, end)区间的数据,返回下一个元素的位置
v.reverse(pos1, pos2); //将vector中的pos1~pos2的元素逆序存储
关联容器
(1) 关联式容器都是有序的,升序排列,自动排序;
(2) 实现的是一个平衡二叉树,每个元素都有一个父节点和两个子节点,
左子树的所有元素都比自己小,右子树的所有元素都比自己大;
set
- 创建set
set<T> s;
set<T, op(比较结构体)> s; //op为排序规则
//使用方法如下
struct myComp
{
bool operator() (const 类型 &a, const 类型 &b)//重载“()”操作符
{
……
return ……;
}
};
// 然后,定义set:
set<T,myComp> s;
- 基本操作
s.size(); //元素的数目
s.max_size(); //可容纳的最大元素的数量
s.empty(); //判断容器是否为空
s.find(elem); //返回值是迭代器类型
s.count(elem); //elem的个数,要么是1,要么是0,multiset可以大于一
s.begin();
s.end();
s.rbegin();
s.rend();
s.insert(elem);
s.insert(pos, elem);
s.insert(begin, end);
s.erase(pos);
s.erase(begin,end);
s.erase(elem);
s.clear();//清除a中所有元素;
- 其他操作
// 遍历set
for(set<T>::iterator it = s.begin(); it != s.end(); i ++) cout << *it << endl;
// 倒序遍历
for(set<T>::reverse_iterator it = s.rbegin(); it != s.end(); i ++ ) cout << *it << endl;
// 查找元素
s.find(key_value) //找到返回迭代器位置,未找到返回s.end()
pair
- 创建pair
pair<T, T> p;
make_pair(a, b); //make_pair内调用的实际还是构造函数
- 基本操作
cout << p.first << " " << p.second << endl;+
map / multimap
map是单重映射, multimap是多重映射
map存储的是无重复键值的元素对,而multimap允许相同的键值重复出现,既一个键值可以对应多个值。
- 创建map
map<T1, T2> m;
map<T1, T2, op> m; //op是排序规则默认是 less<T>,这点和set一样
- 基本操作
m.at(key);
m[key]; //只适用于map,不适用于multimap
m.count(key);
m.max_size(); //求算容器最大存储量
m.size(); //容器的大小
m.begin();
m.end();
m.insert(elem);
m.insert(pos, elem);
m.insert(begin, end);
m.erase(pos);
m.erase(begin,end);
m.erase(key);
-
其他操作
find查找,存在返回迭代器,不存在返回end
修改键值 先删除原来的再添加新的
或者直接像数组赋值就行 m[key] = new_value