map部分的内容参考了这篇文章 https://blog.csdn.net/sevenjoin/article/details/81943864
set部分参考了这篇https://blog.csdn.net/sevenjoin/article/details/81908754
接前一篇,如果说deque对应python中的列表,那么map和set就分别对应python中的字典和集合了。相当重要的两个容器。
Map
map存放key-value对,在内部自建一个红黑树存储,因此map是有序的。
插入元素的方式有三种,但我相信我只会记住也只会用其中一种。
初始化&插入元素:
map<int, string> a;
a[10] = “abc”;(如果已经存在a[10],则会覆盖原值)
可以直接a[10]取得对应的value值。
//迭代器的使用
int main()
{
map<int, string> a;
a[10] = "abc";
a[1] = "a";
for(auto i = a.begin(); i != a.end(); i++)
cout << i->first << ":" << i->second << endl;
}
//or
int main()
{
map<int, string> a;
a[10] = "abc";
a[1] = "a";
for(auto & i : a)
cout << i.first << ":" << i.second << endl;
}
//out:
//1:a
//10:abc
上面第二种写法是clion自动优化过后的,结合比较之前几个容器的迭代器,确认了iterator实际就是每个容器对应的地址。map这个容器在存取元素时是用的类似于结构体的东西,会有first和second对应key和value,在获取first和second时,由于iterator是地址,所以要用->
在map中用erase删除元素有两种方式,一是以迭代器为参数,二是以键key为参数,均可以删除。还可以用迭代器删除一个区间内所有的元素(不常用)
map<char int> m;
m['a'] = 1;
m['b'] = 2;
m.erase('b');
m.erase(m.begin());
可以用count(key)来获取是否已经存在某键值对
map<int, int> m;
m[1] = 10;
m[2] = 20;
cout << m.count(1) << endl << m.count(3) << endl;
//out:
//1
//0
当然作为stl容器的一份子,以下成员函数它也拥有。
clear
empty
size
Set
同map一样,set内部也是用二叉树(红黑树)存储的,因此里面的元素均是有序的,每个元素最多存储一次。
set又分为很多种
1,按关键字有序保存元素:set(关键字即值,即只保存关键字的容器);multiset(关键字可重复出现的set);
2,无序集合:unordered_set(用哈希函数组织的set);unordered_multiset(哈希组织的set,关键字可以重复出现)。
个人认为set最为常用,剩下的可以用其他容器代替。
初始化&插入元素:
set<int> a;
a.insert(1);
set和map相似,成员和之前说的几个stl容器有区别。insert只有一个参数,那就是存储的关键字key,而不需要添加位置position。(因为set是红黑树存储,不是顺序结构,加入元素之后自动排序)
成员函数:
set有个很容易被忽视的函数,count(value),用来判断某个元素是否在set中,如果在返回1,不在返回0.
size
clear
empty
erase同insert一样,直接删除关键字
begin
end
int main()
{
set<int> a;
a.insert(3);
a.insert(2);
a.insert(1);
a.erase(2);
for(auto s = a.begin(); s != a.end(); s++)
cout << *s;
}
//out:13