set基本介绍
set是key模型,本质是确定一个
元素在不在此容器中,也就是说
set中存储的是一个单一数据
set的模板参数只有T
set只支持增删查,不支持改!
set结构中遍历出来是
数据有序并且去重的!
map基本介绍
map和set的区别就是,map中存储
的并不是一个单一数据,而是存储了
一个pair结构!(后面会讲解)
map的模板参数中有key和T
map都支持增删查,不支持改!
map结构中遍历出来是
数据有序并且去重的!
pair结构介绍
pair结构实际上是一个键值对:
template <class T1, class T2>
struct pair
{
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b): first(a), second(b)
{}
};
map中存储的就是pair结构,所以
map也叫存储的KV模型,因为first和
second对应key和value
map的三种常见使用方法:
1. 方法一: 定义pair对象后插入
map<string,string> dict;
pair<string,string> kv1("排序","sort");
pair<string,string> kv2("左边","left");
dict.insert(kv1);
dict.insert(kv2);
2. 方法二: 使用匿名对象插入
map<string,string> dict;
dict.insert(pair<string,string>("排序","sort"));
dict.insert(pair<string,string>("左边","left"));
3. 方法三: 使用make_pair插入
map<string,string> dict;
dict.insert(make_pair("排序","sort"));
dict.insert(make_pair("左边","left"));
显而易见,make_pair是最方便的也是最常用的方法!
set详解
可以看到,第二个模板的第二个参数是less,
set默认情况下遍历出是升序,
但是定义对象显示传参greater就会变为降序!
set<int,greater<int>> s;
插入函数insert
查找函数find
删除函数erase
map详解
相较于set,map还
支持方括号的使用:
string arr[]={"苹果","西瓜","香蕉","苹果","西瓜","西瓜","西瓜","苹果"};
map<string,int> countmap;
for(auto str : arr)
{
countmap[str]++;
}
方括号自带插入功能,当
出现第一个"苹果"时,会自动把"苹果"
插入到map中,第二次遇见"苹果"时,
会将"苹果"的计数++变成2
删除函数
查找函数
erase和find传参只用传pair中的first
类型的参数,即可完成任务,并且find的
返回值和set的find是一样的
multimap和multiset
multimap不支持方括号!
当我们插入相同的数据时,它也会保存
总结
熟悉map和set的使用在平常做题
时会有大用处,但是平时用的更多的
是unordered_map/set,不过它们的
使用方法基本一致。