1 二元组 pair
储存二元组的容器,自行构建结构体也可以实现
作用 | 用法 | 示例 |
---|---|---|
构造 | pair<第一个值数据类型,第二个值数据类型> pr | pair<char,int> pr; |
赋值 | pair<数据类型,数据类型> pr = make_pair( , ) | pair<char,int> pr = make_pair('a',1); |
pair<数据类型,数据类型> pr = { , } | pair<char,int> pr = {'a',1}; | |
取值 | .first/.second | p1 = pr.first , p2 = pr.second; |
判同 | == | 略 |
2 集合 set
提供对数时间的插入、删除、查找的集合数据结构。底层原理是红黑树
集合三要素 | 解释 | set | multiset | unordered_set |
---|---|---|---|---|
确定性 | 一个元素要么在集合中,要么不在 | Y | Y | Y |
互异性 | 一个元素仅可以在集合中出现一次 | Y | N(可出现任意次) | Y |
无序性 | 集合中的元素是没有顺序的 | N(从小到大) | N(从小到大) | Y |
作用 | 用法 | 示例 |
---|---|---|
构造 | set<类型,比较器> st | set<int,greater<int>> st; |
插入元素 | .insert(元素) | st.insert(1); |
删除元素 | .erase(元素) | st.erase(2); |
查找元素 | .find(元素)(返回迭代器) | auto it=st.find(1); |
元素出现次数 | .count(元素) | st.count(3); |
查看大小/清空/判空 | 略 | 略 |
补充及注意事项
1.遍历
//使用迭代器遍历:
for (set<int>::iterator it = st.begin(); it != st.end(); ++it)
cout << *it << endl;
//基于范围的循环(auto枚举):
for (auto &ele : st)
cout << ele << endl;
2.不存在下标索引:set仅可使用迭代器进行遍历,不存在下标这一概念,无法通过下标访问
3.元素只读:set的元素是只读的(是 const 迭代器),不可修改其值。如果要改,需要先 erase 再 insert
4.不可用迭代器计算下标(非线性数据结构的迭代器)
3 映射 map
提供对数时间的有序键值对结构(可理解为函数?)底层原理是红黑树
性质 | 解释 | map | multimap | unordered_map |
---|---|---|---|---|
互异性 | 一个键仅可以在映射中出现一次 | Y | N(任意次) | Y |
无序性 | 键是没有顺序的 | N(从大到小) | N(从大到小) | Y |
作用 | 用法 | 示例 |
---|---|---|
构造 | map<键类型,值类型,比较器> mp | map<int,int,greater<int>> st; //从大到小 |
增/改/查 | [ ] | mp[1]=2; |
查元素 | .find(元素)(返回迭代器) | auto it = mp.find(1); |
删除元素 | .erase(元素) | mp.erase(2); |
元素出现次数 | .count(元素) | mp.count(3); |
查看大小/清空/判空 | 略 | 略 |
补充及注意事项
1.遍历
//使用迭代器遍历:
for (map<int,int>::iterator it = mp.begin(); it != mp.end(); ++it)
cout << it->first << ' ' << it->second << endl;
//基于范围的循环(auto枚举):
for (auto &pr : mp)
cout << pr.first << ' ' << pr.second << endl;
2. 如果使用中括号访问 map 时对应的键不存在,那么会新增这个键,并且值为默认值,因此中括号会影响键的存在性
map<char, int> mp;
cout << mp.count('a') << endl; // 0
mp['a']; // 即使什么都没做,此时mp['a']=0已经插入了
cout << mp.count('a') << endl; // 1
cout << mp['a'] << endl; // 0
3.不可用迭代器计算下标(非线性数据结构的迭代器)
4 列表 list
list是一种双向链表容器,以节点的形式存储元素,并使用指针将节点链接在一起,形成链表结构
特点
1.双向性:每个节点都包含前后两个指针,因此可以在常数时间内在链表任意位置进行插入、删除和访问
2.动态大小
3.不连续存储
作用 | 用法 | 示例 |
---|---|---|
构造 | list<类型> Ls | list<int> ls |
插入头/尾 | .push_back(元素) / .push_front(元素) | ls.push_back(2); |
移除头/尾 | .pop_back() / .push_front() | ls.pop_front(); |
引用头/尾 | .front() / .back() | int m = ls.front; |
指定位置插入 | .insert(迭代器,元素/元组) | 略 |
移除指定位置 | .erase(迭代器头,迭代器尾) | 略 |
查看大小/清空/判空 | 略 | 略 |