博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL 笔记(二) 关联容器 map、set、multimap 和 multimap
阅读量:6072 次
发布时间:2019-06-20

本文共 6921 字,大约阅读时间需要 23 分钟。

STL 关联容器简单介绍

关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素。

在 STL 中,有四种关联容器,各自是:

  • map 键值对 key-value 存储,key 不可反复,即一个 key 仅仅能相应一个 value, 相应头文件<map>
  • multimap 键值对 key-value 存储,key 能够反复,即一个 key 能够相应多个 value, 相应头文件<map>
  • set 仅仅有 key, key 不可反复,相应头文件<set>
  • multiset 仅仅有 key, key 能够反复。相应头文件<set>  

STL 关联容器特点

  • STL 关联容器的底层数据结构是红黑树。故其增删查的时间复杂度都是 O(logn)
  • map 默认依照 key 的升序进行插入,非基本数据类型要求重载 < 运算符
  • map 重载了 [] 运算符,使的插入和查找很方便
  • map 用 [] 运算符訪问元素时,假设不存在这个key。key会自己主动插入,value为初始化值
  • map 的 key 对象使用之后就不要再改动,假设必须改动,须要删除后又一次插入
  • multimap 的 key-value 是一对多,没有重载 [] 运算符

map 经常使用函数

#构造:map c:                                                           #创建空映射,不包括不论什么元素map c(op):                                                       #以 op 为排序准则,产生一个空的mapmap c1(c2):                                                      #复制 c2 中的元素到 c1 中map c(const value_type *first, const value_type* last):          #复制 [first, last) 之间元素构成新映射map c(const value_type *first, const value_type* last,op):       #以 op 为排序准则。复制[first, last)之间元素构成新映射multimap m:                                                      #创建空映射,不包括不论什么元素  multimap m(op):                                                  #以 op 为排序准则,产生一个空的 multimapmultimap m1(m2):                                                 #复制 m2 中的元素到 m1 中multimap m(const value_type *first, const value_type* last):     #复制 [first, last)之间元素构成新映射multimap m(const value_type *first, const value_type* last,op):  #以op为排序准则,复制 [first, last)之间元素构成新映射#增删iterator insert(const value_type& x):                            #插入元素 xiterator insert(iterator it,const value_type& x):                #在迭代指针 it 处插入元素xvoid insert(const value_type *first,const value_type* last):     #插入[first, last)之间元素iterator erase(iterator it):                                     #删除迭代指针it处元素iterator erase(iterator first,iterator last):                    #删除[first, last)之间元素size_type erase(const Key& key):                                 #删除键值等于key的元素#遍历iterator begin():                                                #返回首元素的迭代器指针iterator end():                                                 #返回尾元素的迭代器指针reverse_iterator rbegin():                                       #返回尾元素的逆向迭代器指针reverse_iterator rend():                                         #返回首元素前一个位置的迭代器指针reference operator[](const Key& k):                              #仅仅用在映射map 类中。重载[],并返回值的引用#功能int size() const:                                                #返回容器元素个数bool empty() const:                                              #推断容器是否空。若返回true。表明容器已空const_iterator find(const Key& key) const:                       #查找返回键值等于 key 的迭代器指针int count(const Key& key) const:                                 #返回键值等于 key 的元素的个数const_iterator lower_bound(const Key& key):                      #返回键大于等于 key 的第一个迭代器指针const_iterator upper_bound(const Key& key):                      #返回键大于 key 的第一个迭代器指针pair
equal_range(const Key& key) const: #返回一对迭代器,使得[first, last)内元素等于key

set 经常使用函数

#构造set c:                                                          #创建空集合,不包括不论什么元素set c(op):                                                      #以 op 为排序准则。产生一个空的 setset c1(c2):                                                     #复制 c2 中的元素到 c1 中set c(const value_type *first, const value_type* last):         #复制 [first, last) 之间元素构成新集合set c(const value_type *first, const value_type* last,op):      #以 op 为排序准则。复制 [first, last) 之间元素构成新集合multiset m:                                                     #创建空集合,不包括不论什么元素multiset m(op):                                                 #以 op 为排序准则,产生一个空的 setmultiset m1(m2):                                                #复制 m2 中的元素到 m1 中multiset m(const value_type *first, const value_type* last):    #复制 [first, last) 之间元素构成新集合multiset m(const value_type *first, const value_type* last,op): #以 op 为排序准则,复制 [first, last) 之间元素构成新集合#增删pair
insert( x): #插入元素xiterator insert(iterator it,x): #在迭代器it处插入元素xvoid insert(const value_type *first,const value_type *last): #插入[first, last)之间元素iterator erase(iterator it): #删除迭代器指针it处元素iterator erase(iterator first,iterator last): #删除[first, last)之间元素size_type erase(const Key& key): #删除元素值等于key的元素#遍历iterator begin(): #返回首元素的迭代器指针iterator end(): #返回尾元素的迭代器指针reverse_iterator rbegin(): #返回尾元素的逆向迭代器指针reverse_iterator rend(): #返回首元素前一个位置的迭代器指针#功能int size() const: #返回容器元素个数bool empty() const: #推断容器是否为空,若返回true,表明容器已空const_iterator find(const Key& key) const: #查找返回元素值等于key的迭代器指针int count(const Key& key) const: #返回容器中元素等于key的元素的个数const_iterator lower_bound(const Key& key): #返回键大于等于 key 的第一个迭代器指针const_iterator upper_bound(const Key& key): #返回键大于 key 的第一个迭代器指针pair
equal_range(const Key& key) const: #返回一对迭代器,使得[first, last)内元素等于keyvoid swap(set& s): #交换集合元素void swap(multiset& s): #交换多集合元素

map 小样例

#include 
#include
using namespace std;class Cat {public: int age; Cat(int age) { this->age = age; } /* map 底层是红黑树,用作 key 的对象必须可排序, 需重载 < 运算符 */ bool operator <(const Cat &c) const { return age < c.age; }};int main() { map
m; m.insert(map
::value_type('a', 'a')); m['b'] = 'b'; cout << "m['a'] is: " << m['a'] << ", "; // 用运算符[]訪问 map
::iterator it = m.find('b'); // 用迭代器訪问 cout << "m['b'] is: " << it->second << ", "; cout << "m['c'] is: " << m['c'] << endl; // 用 []訪问要先推断是否存在,不存在则会被插入 m['c'] = 'c'; m['d'] = 'd'; for (map
::iterator it = m.begin(); it != m.end(); it++) { cout << it->first << ":"; // `first` 是 key, 不可改动(const 修饰) cout << (*it).second << ", "; // `second` 是value,能够改动 } map
::iterator it_low, it_up; it_low = m.lower_bound('c'); it_up = m.upper_bound('c'); cout << "\nlower_bound('c') is: " << it_low->first << endl; cout << "upper_bound('c') is: " << it_up->first << endl; pair
::iterator, map
::iterator> ret; ret = m.equal_range('c'); cout << "equal_range('c'): " << ret.first->first << ", "<< ret.second->first << endl; map
t; Cat c(1); t[c] = 'a'; c.age = 2; // key 对象改动后,无法再从 map 查到这个键值对 cout << "改动 key 对象后,再次查找这个 key 出现的次数: " << t.count(c) << endl;}/* 输出: m['a'] is: a, m['b'] is: b, m['c'] is: a:a, b:b, c:c, d:d, lower_bound('c') is: c upper_bound('c') is: d equal_range('c'): c, d 改动 key 对象后。再次查找这个 key 出现的次数: 0 */

【地址:http://blog.csdn.net/thisinnocence/article/details/39646813】

转载于:https://www.cnblogs.com/gavanwanggw/p/7214748.html

你可能感兴趣的文章
实验四 主存空间的分配和回收
查看>>
解决eclipse之ADT与SDK版本不一致问题
查看>>
jQuery 属性操作
查看>>
小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践
查看>>
387. 字符串中的第一个唯一字符
查看>>
(转)ORA-01245错误 (2013-04-13 18:37:01)
查看>>
shiro笔记-AuthenticatingRealm和AuthorizingRealm关系
查看>>
内联网
查看>>
从键盘上连续录入一批整数,比较并输出其中的最大值和最小值,当输入数字0时结束循环...
查看>>
mysql中触发器如何监听本身并且改变本身的字段?
查看>>
VBA 高级筛选
查看>>
设置应用图标badge(徽章)
查看>>
洛谷P4891 序列
查看>>
省选前做题记录
查看>>
批量替换行首
查看>>
jenkins对接gitlab和git
查看>>
MANIFEST.MF中的MF是什么意思
查看>>
归并排序与递归
查看>>
CVE-2018-0802漏洞利用
查看>>
根据业务压力测试
查看>>