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