目录
1.关联式容器
2.键值对
3.树形结构的关联式容器
3.1 set
3.1.1 set的介绍
3.1.2 set的使用
3.2 multiset
3.2.1 multiset的介绍
3.2.2 multiset的使用
3.3 map
3.3.1 map的介绍
3.3.2 map的使用
3.4 multimap
3.4.1 multimap的介绍
3.4.2 multimap的使用
4.习题
1.关联式容器
2.键值对
key的类型是第一个模板的类型,value的类型是第二个模板的类型
stl30中pair设计如下:
template <class T1, class T2>
struct pair {typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair() : first(T1()), second(T2()) {}pair(const T1& a, const T2& b) : first(a), second(b) {}#ifdef __STL_MEMBER_TEMPLATEStemplate <class U1, class U2>pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
#endif
};
3.树形结构的关联式容器
树形结构的关联式容器:map、set、multimap、multiset。
这四种容器的共同点:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。
3.1 set
3.1.1 set的介绍
set文档
注意:1. 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。2. set中插入元素时,只需要插入value即可,不需要构造键值对。3. set中的元素不可以重复(因此可以使用set进行去重)。4. 使用set的迭代器遍历set中的元素,可以得到有序序列5. set中的元素默认按照小于来比较6. set中查找某个元素,时间复杂度为:log(n)7. set中的元素不允许修改8. set中的底层使用二叉搜索树(红黑树)来实现
3.1.2 set的使用
- set的模板参数列表
2.set的使用举例(查看文档的函数)
- 构造
- 迭代器
- 修改操作
3.2 multiset
3.2.1 multiset的介绍
注意:
1. multiset中在底层中存储的是<value, value>的键值对2. mtltiset的插入接口中只需要插入即可3. 与set的区别是,multiset中的元素可以重复,set是中value是唯一的4. 使用迭代器对multiset中的元素进行遍历,可以得到有序的序列5. multiset中的元素不能修改6. 在multiset中找某个元素,时间复杂度为log(N)7. multiset的作用:可以对元素进行排序
3.2.2 multiset的使用
- multiset.count(统计个数)
- multiset.find(val)——返回中序的第一个val的迭代器
- multiset.erase(val)——删除所有的val
3.3 map
3.3.1 map的介绍
map文档
3.3.2 map的使用
- map的模板参数说明
2.map的使用
操作几乎和set一致,可以看文档自己学习,重点来看下operator[ ]
访问元素 :
如果k与容器中某个元素的键匹配,该函数将返回对其映射值的引用。
如果k与容器中任何元素的键都不匹配,该函数将插入一个带有该键的新元素,并返回对其映射值的引用。请注意,这总是将容器大小增加1,即使没有为元素分配映射值(元素是使用其默认构造函数构造的)。
总结:
- map::operator[ ]
1.map中有这个key,返回value的引用。(查找、修改value)
2.map中没有这个key,会插入一个pair(key,V()),返回value的引用。(插入+修改)
- map::insert
1.key已经在map中,返回pair(key_iterator,false)
2.key不在map中,返回pair(new_key_iterator,true)
3.4 multimap
3.4.1 multimap的介绍
3.4.2 multimap的使用
4.习题
最后再贴2道,map和set使用的习题,大家可以试着写一写,理论+实践,自己动手弄懂才是真的学懂了!
前K个高频单词https://leetcode.cn/problems/top-k-frequent-words/description/
class Solution {
public:vector<string> topKFrequent(vector<string>& words, int k) {map<string,int>Countmap;//map[]插入+修改实现统计for(auto& str:words){Countmap[str]++;}//比较次数,我们把次数作为Key,降序排multimap<int,string,greater<int>>sortmap;for(auto& kv:Countmap){sortmap.insert(make_pair(kv.second,kv.first));}vector<string>v;multimap<int,string,greater<int>>::iterator it=sortmap.begin();while(k--){v.push_back(it->second);++it;}return v;}
};
两个数组的交集Ihttps://leetcode.cn/problems/intersection-of-two-arrays/submissions/
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {//找交集(有序):小的往后走,相等找到存入并同时走set<int>s1(nums1.begin(),nums1.end());set<int>s2(nums2.begin(),nums2.end());auto it1=s1.begin();auto it2=s2.begin();vector<int>v;while(it1!=s1.end()&&it2!=s2.end()){if(*it1<*it2){++it1;}else if(*it2<*it1){++it2;}else{v.push_back(*it1);++it1;++it2;}}return v;}
};