关联容器:
关联容器中的元素是按照关键字来保存和访问的。也就是通过键去获得对应的值 。两个主要的关联容器类型是map和set。
map中的元素是关键字-值对,set中的元素只包含一个关键字。
有序容器
关联容器类型 | 作用 |
---|---|
map | 关键字-值对 |
set | 关键字 |
multimap | 关键字可重复出现的map |
multiset | 关键字可重复出现的set |
关联容器额外的类型别名 | 作用 |
---|---|
key_type | 此容器类型的关键字类型 |
mapped_type | 每个关键字关联的类型,只适用于map |
value_type | 对于set,与key_type相同,对于map,为pair<const key_type,mapped_type> |
set<string>::value_type v1; //v1是一个 string 类型
set<string>::key_type v2; //v2是一个 string 类型
map<string,int>::value_type v3; //v3是一个 pair<const string,int> 类型
map<string,int>::key_type v4; //v4是一个 string 类型
map<string,int>::mapped_type v5; //v5是一个 int 类型
insert(或emplace)进行插入操作的时候,如果容器中已经存在这个关键字,就什么也不做,如果不存在,就进行插入操作,并返回一个pair,告诉我们插入操作是否成功。
#include <iostream>
#include <map>
#include <list>
using namespace std;
int main(){
map<string,int> map_count;
//向map中添加元素的四种方法
map_count.insert({"aaa",1});
map_count.insert(pair<string,int>("bbb",2));
map_count.insert(map<string,int>::value_type("ccc",3));
map_count.insert(make_pair("ddd",4));
return 0;
}
对于map而言,value_type是一个pair类型,其 first 成员保存关键字,second 成员保存值。并且需要通过->来访问 first 和 second 成员的值。我们可以改变 pair 的值,但不能改变关键字成员的值,因为关键字是const 的。
对于set而言,set的迭代器也是const的。
#include <iostream>
#include <map>
#include <list>
using namespace std;
int main(){
map<string,int> map_count;
//向map中添加元素的四种方法
map_count.insert({"aaa",1});
map_count.insert(pair<string,int>("bbb",2));
map_count.insert(map<string,int>::value_type("ccc",3));
map_count.insert(make_pair("ddd",4));
//删除元素
map_count.erase("aaa");
//通过键去访问
cout << map_count["bbb"] << endl;;
//查找元素
map_count.find("ccc"); //返回一个迭代器,指向第一个关键字为ccc的元素,若ccc不再容器中,则返回尾后迭代器
map_count.count("ccc"); //返回关键字等于ccc的元素的数量。
map_count.lower_bound("ccc"); //返回一个迭代器,指向第一个关键字不小于k的元素
map_count.upper_bound("ccc"); //返回一个迭代器,指向第一个关键字大于k的元素
//遍历map
map<string,int>::iterator iter = map_count.begin();
while(iter != map_count.end()){
cout << iter->first << " = " << iter->second << endl;
++iter;
}
return 0;
}