关联容器有:map、multimap、set、multiset
map的元素是pair类型、<关键字,值>对,其中关键字是const,不能修改,值可以修改。
set的元素是关键字,const,只能访问、不能修改。
multimap 和 multiset 都允许多个元素有相同的关键字。
当用一个迭代器遍历一个 map、multimap、set、multiset 时,迭代器会按照关键字升序遍历元素。
通常,不对关联容器使用泛型算法,因为它们的关键字都是const,无法修改,而且关联容器的元素不能通过他们的关键字快速查找。
使用实例:
#include<map>
#include<set>
using namespace std;
// 打印map,默认升序打印
void printmap(const map<string, int>&map)
{
for_each(map.begin(), map.end(), [](const pair<string, int>&i) {cout << i.first << " : " << i.second << endl;});
cout << endl;
}
// 打印set,默认升序打印
void printset(const set<int>&set)
{
for_each(set.begin(), set.end(), [](const int&i) {cout << i << " " ; });
cout << endl;
}
int main()
{
map<string, int> imap = {{"xiaoming", 12},{"Mike", 26},{"linda", 10}};
//修改map的值
auto it = imap.begin();
it->second = 99;
//输出变量it的类型名
cout << typeid(it).name() << endl;
//给map添加元素有四种方法,insert()的返回值ret是pair类型,
//pair的first成员ret.first是一个迭代器,指向具有给定关键字的元素
//pair的second成员ret.second是个bool值,表示元素插入成功与否
//ret.first-> : 解引用此迭代器,提取map中的元素,元素也是一个pair
//ret.first->second :map中元素的值部分
//++ret.first->second :递增此值
imap.insert({"joe", 22});
imap.insert(make_pair("liu", 33));
imap.insert(pair<string, int>("zhang", 44));
imap.insert(map<string, int>::value_type("xu", 55));
//打印map
printmap(imap);
set<int> iset = {3,1,8,6,9,0,7,4};
//给set添加元素:insert(一堆迭代器or初始化列表),若插入已存在的元素,则对容器无影响
iset.insert({11,22,33,11,22,33});
vector<int> ivec = {23,45,67,67,78};
iset.insert(ivec.begin(), ivec.end());
//打印set
printset(iset);
system("pause");
return 0;
}
打印的结果:
Mike : 26
linda : 10
xiaoming : 12
0 1 3 4 6 7 8 9