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 为排序准则,产生一个空的map
map 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 为排序准则,产生一个空的 multimap
multimap 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): #插入元素 x
iterator insert(iterator it,const value_type& x): #在迭代指针 it 处插入元素x
void 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<const_iterator,const_iterator> equal_range(const Key& key) const: #返回一对迭代器,使得[first, last)内元素等于key

set 经常使用函数

#构造
set c: #创建空集合,不包括不论什么元素
set c(op): #以 op 为排序准则。产生一个空的 set
set 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 为排序准则,产生一个空的 set
multiset 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<iterator,bool> insert( x): #插入元素x
iterator insert(iterator it,x): #在迭代器it处插入元素x
void 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<const_iterator,const_iterator> equal_range(const Key& key) const: #返回一对迭代器,使得[first, last)内元素等于key
void swap(set& s): #交换集合元素
void swap(multiset& s): #交换多集合元素

map 小样例

#include <iostream>
#include <map>
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<char, char> m;
m.insert(map<char, char>::value_type('a', 'a'));
m['b'] = 'b';
cout << "m['a'] is: " << m['a'] << ", "; // 用运算符[]訪问
map<char, char>::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<char, char>::iterator it = m.begin(); it != m.end(); it++) {
cout << it->first << ":"; // `first` 是 key, 不可改动(const 修饰)
cout << (*it).second << ", "; // `second` 是value,能够改动
}
map<char, char>::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<map<char, char>::iterator, map<char, char>::iterator> ret;
ret = m.equal_range('c');
cout << "equal_range('c'): " << ret.first->first << ", "<< ret.second->first << endl;
map<Cat, char> 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】

STL 笔记(二) 关联容器 map、set、multimap 和 multimap的更多相关文章

  1. STL笔记(1)map

    STL笔记(1)map STL之map ZZ from http://hi.baidu.com/liyanyang/blog/item/d5c87e1eb3ba06f41bd576cf.html 1. ...

  2. C++关联容器<map>简单总结

    C++关联容器<map>简单总结 map提供大小可变的关联容器,基于关联键值高效检索元素值.当你处理键值对的数据是,都可以考虑使用map关联容器. 特点: 大小可变的关联容器,基于关联键值 ...

  3. c++中关联容器map的使用

    C++关联容器<map>简单总结(转) 补充: 使用count,返回的是被查找元素的个数.如果有,返回1:否则,返回0.注意,map中不存在相同元素,所以返回值只能是1或0. 使用find ...

  4. STL学习笔记(三) 关联容器

    条款19:理解相等(equality)和等价(equivalence)的区别 相等的概念是基于 operator== 的,如果 operator== 的实现不正确,会导致并不实际相等等价关系是以&qu ...

  5. C++ 之关联容器 map

    标准库定义了四种关联容器:map是其中之一(另外还有set.multimap.multiset).map的元素以键-值(key-value),在学了顺序容器之后,再学习关联容器,就比较比较好理解了. ...

  6. 高放的c++学习笔记之关联容器

    标准库提供8个关联容器 按关键字有序保存有(红黑树实现) set map multset 关键字可重复出现的set multimap  关键字可重复出现的map 无序保存 哈希实现 unorderre ...

  7. 关联容器——map、set

    map类型通常被称为关联数组,与正常数组类似,不同之处在于其下标不必是整数.我们通过一个关键字而不是位置来查找值(键值对). 与之相对,set就是关键字的简单集合.当只是想知道一个值是否存在时,set ...

  8. 关联容器(map):支持高效查找的容器,一种键值对的集合。

    #include <iostream> #include <string> #include <map> #include <vector> using ...

  9. 关联容器map(红黑树,key/value),以及所有的STL容器详解

    字符串或串(String)是由数字.字母.下划线组成的一串字符.一般记为 s=“a1a2···an”(n>=0).它是编程语言中表示文本的数据类型.在程序设计中,字符串(string)为符号或数 ...

随机推荐

  1. android sdk 下载

    不知道是因为最近kaihui还是怎么的,打开android sdk官方网站特别的慢,想下载最新版本的platform几乎变成不可能完成的任务,不知道为什么Google不像Apache那样在各国设立镜像 ...

  2. 18,OS模块

    import os print(os.getcwd())#执行所在的目录 # os.makedirs('\python作业\景s12\day18')#可生成多层递归目录 # os.mkdir('\py ...

  3. 为什么我打的jar包没有注解?

    本文来自网易云社区 作者:王飞 一.前言 一切问题的起源就是来自一个问题"为什么我打的jar包没有注解?",带着这个疑问查了一圈资料,原来问题主要是在没有将源码中的注释进行抽取打包 ...

  4. c++ stack,queue,vector基本操作

    stack 的基本操作有:入栈,如例:s.push(x);出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素.访问栈顶,如例:s.top()判断栈空,如例:s.empty(), ...

  5. Python 可变对象与不可变对象

    1. 不可变(immutable):int.字符串(string).float.(数值型number).元组(tuple) 可变(mutable):字典型(dictionary).列表型(list) ...

  6. CSS参数介绍

    原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 行高       line-height: 16px 宽度       (具体位置)-width: 16px 文字 ...

  7. 说说icon图标

    咳咳,其实我是想copy过来的,然而,他竟然是用代码写的图标... (正经脸)话说icon图标是一种网页中常用图标的一种,网络上有各式各样的应用案例,在此就不多啰嗦了.其实我也不过是用着现成的而已,所 ...

  8. MySql将查询结果插入到另外一张表

    今天遇到一个业务需求是这样的:对在职员工超过55岁提醒.我想的思路是查询员工表,然后将超过55岁的人的信息存到另一个表,并且以消息的形式给用户提示,用户处理掉之后此消息失效(在数据库做标记). 不管是 ...

  9. formSubmit

    精简代码: <form name='form0001' method="post"> .... <li id="view"><a ...

  10. mac 获得进程信息的方法

    NSProcessInfo可以获得当前进程的信息.获得所有活动进程信息可以尝试使用下面的方法. 进程的信息可以通过ps命令得到也可以通过sysctl方法得到. 但是我总是不能获取进程的流量信息,关于这 ...