这篇主要讲一下关联容器
1.set(集合容器)/ multiset(多重集容器)
set和multiset都是集合类模板,其元素值称为关键字。set中元素的关键字是唯一的,multiset中元素的关键字可以不唯一,而且默认情况下会对元素按关键字自动进行升序排列。
查找速度比较快,同时支持集合的交、差和并等一些集合上的运算,如果需要集合中的元素允许重复那么可以使用multiset。
主要成员函数:
- empty():判断容器是否为空
- size():返回容器中实际元素个数
- insert():插入元素
- erase():从容器删除一个或几个元素
- clear():删除所有元素
- count(k):返回容器中关键字k出现的次数
- find(k):如果容器中存在关键字为k的元素,返回该元素的迭代器,否则返回end()值
- upper_bound():返回一个迭代器,指向关键字大于k的第一个元素
- lower_bound():返回一个迭代器,指向关键字不小于k的第一个元素
- 迭代器函数:begin()、end()、rbegin()、rend()
演示代码:
#include<iostream>
#include<cstdio>
#include <set>
using namespace std;
int main()
{
set<int> s; //定义set容器s
set<int>::iterator it; //定义set容器迭代器it
s.insert(1);
s.insert(3);
s.insert(2);
s.insert(4);
s.insert(2);
printf(" s: ");
for (it = s.begin(); it != s.end(); it++)
printf("%d ", *it);
printf("\n");
multiset<int> ms; //定义multiset容器ms
multiset<int>::iterator mit; //定义multiset容器迭代器mit
ms.insert(1);
ms.insert(3);
ms.insert(2);
ms.insert(4);
ms.insert(2);
printf("ms: ");
for (mit = ms.begin(); mit != ms.end(); mit++)
printf("%d ", *mit);
printf("\n");
return 0;
}
输出:
s: 1 2 3 4
ms: 1 2 2 3 4
2.map(映射容器)/ multimap(多重映射容器)
实现头文件:< set>
概述:
map和multimap都是映射类模板。映射是实现关键字与值关系的存储结构,可以使用一个关键字key来访问相应的数据值value。
在map和multimap 中的key和value是一个pair类结构。
pair类结构的声明形如:
1 | struct pair |
map/multimap利用pair的<运算符将所有元素即key-value对按key的升序排列,以红黑树的形式存储,可以根据key快速地找到与之对应的value(查找时间为O(log2n))。
map中不允许关键字重复出现,支持[]运算符;而multimap中允许关键字重复出现,但不支持[]运算符。
主要成员函数:
- empty():判断容器是否为空
- size():返回容器中实际元素个数
- map[key]:返回关键字为key的元素的引用,如果不存在这样的关键字,则以key作为关键字插入一个元素(不适合multimap)
- insert(elem):插入一个元素elem并返回该元素的位置
- clear():删除所有元素
- find():在容器中查找元素
- count():容器中指定关键字的元素个数(map中只有1或者0)
- 迭代器函数:begin()、end()、rbegin()、rend()
演示代码:
1.1
2map<char,int> mymap; //定义map容器mymap,其元素类型为pair<char,int>
mymap['a'] = 1; //或者mymap.insert(pair<char,int>('a',1) );
2.
#include<iostream>
#include <map>
using namespace std;
int main()
{
map<char, int> mymap; //定义map容器mymap
mymap.insert(pair<char, int>('a', 1)); //插入方式1
mymap.insert(map<char, int>::value_type('b', 2)); //插入方式2
mymap['c'] = 3; //插入方式3
map<char, int>::iterator it;
for (it = mymap.begin(); it != mymap.end(); it++)
printf("[%c,%d] ", it->first, it->second);
printf("\n");
return 0;
}
输出:
[a,1] [b,2] [c,3]