在STL中,vector、list、deque等称为序列式容器,这些容器的底层为线性序列的数据结构,里面存储的是元素本身。而关联式容器存储的是结构的键值对,key和value是一一对应的关系。map、set、multimap、multiset均为树形结构,它们都是使用平衡搜索树作为其底层结构,容器中的元素是一个有序的序列。
一、map
map中的元素是按照键值key进行比较排序的,并且支持下标访问符,即每一个map[key]对应一个value,map中的key值是唯一的。
1、map的插入
void Test() {
map m;
map m1;
//①、在map中插入键值对
//插入键值对时,会按照键值key进行排序,默认从小到大
m.insert(pair(3, 2));
m.insert(pair(0, 6));
m.insert(pair(4, 5));
//②、在positon上插入键值对
map ::iterator it = m.begin();
m.insert(it, pair(2, 6));
//③、在map中插入[first,last)之间的元素
m1.insert(m.begin(), m.end());
for (auto & e : m) {
cout << e.first << "-->" << e.second << endl;
}
for (auto & e : m1) {
cout << e.first << "-->" << e.second << endl;
}
}
2、map的删除
void Test() {
map m;
m['a'] = 10;
m['b'] = 20;
m['c'] = 25;
m['d'] = 23;
m['e'] = 24;
m['f'] = 26;
map ::iterator it = m.begin();
//①、删除position上的键值对
m.erase(it);
//②、删除键值为key的键值对
m.erase('c');
//③、删除[first, last)之间的元素
it = m.find('d');
m.erase(it, m.end());
for (auto & e : m) {
cout << e.first << "-->" << e.second << endl;
}
}
multimap和map的区别:multimap中的key值可以重复,map的key值不能重复。
二、set
在set中,元素的value也能标识它,并且每个value是唯一的,因此set中的元素不能重复。map/multimap中存储的是真正的键值对
void Test() {
vector v{ 1, 2, 3, 5, 6, 7, 9, 34, 56, 2, 3, 6, 11, 23 };
//set在插入元素的时候会默认按小于的比较方式排成有序序列,并且会自动去重
set s(v.begin(), v.end());
cout << s.size() << endl;
for (auto & e : s) {
cout << e << ' ';
}
}
multiset和set的区别:set中的value是唯一的,multiset中的value可以重复,因此,set可以用来去重,multiset可以用来排序。