接 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
-
set:描述了一个控制变长元素序列的对象的模板类,每一个元素包含了一个排序键(sort key)和一个值(value)。
-
set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。set和multiset的底层实现是红黑树,红黑树为平衡二叉树的一种。
map/multimap
- Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。pair定义在头文件中,其本身相当于一个已经重定义过的,有两个元素的结构体。它始终以前一个元素(first)为第一关键字,后一个元素(second)为第二关键字。
- map的节点是一对数据. set的节点是一个数据.
- Multimap和map的操作类似,唯一区别multimap键值可重复。Map和multimap都是以红黑树为底层实现机制。
set 和 map 区别
操作 | set | map |
---|---|---|
构造 | 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相等的上下限的两个迭代器。 |