C++第十三讲:map && set
1.序列式容器和关联式容器
前面我们接触到的容器,如string、deque、vector等,它们都是按照元素的插入顺序来进行存储的,并不会对元素的顺序进行改变,元素的位置是固定的,数据元素之间存在一对一的线性关系,所以序列式容器的逻辑结构为线性序列的数据结构
而关联式容器,如我们要学习的map和set、unordered_map和unordered_set容器,元素是按照关键字(key)值的大小顺序进行一个存储和排列的,数据元素之间并不存在固定的一对一的关系,所以关联式容器的逻辑结构是非线性结构
2.set的使用
2.1set容器函数详解
在上一讲二叉搜索树中,我们最后讲到了key和key/value的使用场景,而set就是key使用场景的一个容器:
2.1.1set和multiset的区别
所以我们下面先看一下set:
2.1.2set的模板参数
set的底层实现为红黑树,增删查效率为logN
2.1.3构造函数
2.1.4迭代器和insert插入
insert:
迭代器:
迭代器的使用不再讲,要说的就是迭代器的begin位置是中序遍历的第一个位置
2.1.5count和find
2.1.6lower_bound、upper_bound和erase
2.1.7multiset和set的差异
1.multiset允许插入相同的值
2.multiset使用erase进行删除时,会将所有相同的元素都删除了:
int main()
{
multiset<int> m1 = {
4, 4, 4, 2, 1 };
m1.erase(4);
for (auto e : m1)
{
cout << e << " ";//1 2
}
cout << endl;
return 0;
}
3.mulitiset对于find函数进行相同元素查找时,原理会有所不同:
multiset进行find查找时,查找的是中序遍历的第一个key:
int main()
{
multiset<int> m1 = {
4, 4, 4, 2, 1 };
multiset<int>::iterator it = m1.find(4);
while (it != m1.end())
{
cout << *it << " "