C++ STL 02


接 STL01


STL

常用容器

  • vector封装数组,list封装了链表,map和set封装了二叉树。承上启下:

    vector(向量)——STL中标准而安全的数组。只能在vector 的“前面”增加数据。
    deque(双端队列double-ended queue)——在功能上和vector相似,但是可以在前后两端向其中添加数据。
    list(列表)——游标一次只可以移动一步。如果你对链表已经很熟悉,那么STL中的list则是一个双向链表(每个节点有指向前驱和指向后继的两个指针)。
    set(集合)——包含了经过排序了的数据,这些数据的值(value)必须是唯一的。
    map(映射)——经过排序了的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)是在排序 或搜索时使用,它的值可以在容器中重新获取;而另一个值是该元素关联的数值。
    map:比如,除了可以ar[43] = "overripe"这样找到一个数据,map还可以通过ar["banana"] = "overripe"这样的方法找到一个数据。如果你想获得其中的元素信息,通过输入元素的全名就可以轻松实现。
    multiset(多重集)——和集合(set)相似,然而其中的值不要求必须是唯一的(即可以有重复)。
    multimap(多重映射)——和映射(map)相似,然而其中的键值不要求必须是唯一的(即可以有重复)。

set/multiset

  1. set:描述了一个控制变长元素序列的对象的模板类,每一个元素包含了一个排序键(sort key)和一个值(value)。

  2. set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。set和multiset的底层实现是红黑树,红黑树为平衡二叉树的一种。

  3. 原理参考下图:(from 江南烟雨)江南烟雨图

map/multimap

  1. Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。pair定义在头文件中,其本身相当于一个已经重定义过的,有两个元素的结构体。它始终以前一个元素(first)为第一关键字,后一个元素(second)为第二关键字。
    在这里插入图片描述
  2. map的节点是一对数据. set的节点是一个数据.
  3. Multimap和map的操作类似,唯一区别multimap键值可重复。Map和multimap都是以红黑树为底层实现机制。

set 和 map 区别

操作setmap
构造1. set st;//set默认构造函数:
2. mulitset mst; //multiset默认构造函数:
3. set(const set &st);// 拷贝构造函数
1. map<T1, T2> mapTT;//map默认构造函数:
2. map(const map &mp);//拷贝构造函数
赋值1. set& operator=(const set &st);//重载等号操作符
2. swap(st);//交换两个集合容器
2. map& operator=(const map &mp);//重载等号操作符
2. swap(mp);//交换两个集合容器
大小1. size();//返回容器中元素的数目
2. empty();//判断容器是否为空
1. size();//返回容器中元素的数目
2. empty();//判断容器是否为空
增删1. insert(elem);//在容器中插入元素。
2. clear();//清除所有元素
3. erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
4. erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
5. erase(elem);//删除容器中值为elem的元素。
1. map.insert(…); //往容器插入元素,返回pair<iterator,bool>
2. map<int, string> mapStu;
2.1 mapStu.insert(pair<int, string>(3, “小张”));// 第一种 通过pair的方式插入对象
2.2 mapStu.inset(make_pair(-1, “校长”));// 第二种 通过pair的方式插入对象
2.3 mapStu.insert(map<int, string>::value_type(1, “小李”));// 第三种 通过value_type的方式插入对象
2.4 mapStu[3] = “小刘”;mapStu[5] = “小王”;// 第四种 通过数组的方式插入值
3. clear();//删除所有元素
4. erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
5. erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
6. erase(keyElem);//删除容器中key为keyElem的对组。
查找1. find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
2. count(key);//查找键key的元素个数
3. lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
4. upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
5. equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
1. find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
2. count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
3. lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
4. upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
5. equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

C++ STL 03

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Echo一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值