本篇文章在上一篇文章的基础上进一步介绍一些常用的容器。
一、 Stack和Queue
?
二、 Map
Map是一种关联容器,存储的对象是键值(Key-Value)对。和Python中的字典相似。Map中的键值对永远是排好序的。
Map中所存储的键对象必须是可排序的,默认采用从小到大的排序方式。也可以通过函数对象的方式进行指定。Map的标准头为:
template <class _Kty, class _Ty,class _Pr = less<_Kty>,class _Alloc = allocator<Pair<const _Kty,_Ty>>> class map {...} |
其中的less<_Kty>是一个函数式对象,代表了排序函数,分配器通常为默认分配器。
2.1 Map的创建
通过Pair和迭代器创建并初始化,其中Pair的第一个值为键,第二个值为值。
const std::pair<int ,char>items[3] = { ????std::make_pair(1,‘a‘),std::make_pair(2,‘b‘),std::make_pair(3,‘c‘) } std::map<int,char> map1(item,item+3); |
2.2 Map的元素插入
1 通过insert成员函数
map1.insert(std::make_pair(4,‘d‘); |
2 直接使用未使用的下标
map1[5] = ‘e‘; |
2.3 Map的元素删除
iterator erase(iterator it); |
1 通过一个条目对象删除 |
iterator erase(iterator first, iterator last);???????? |
2 删除一个范围 |
size_type erase(const Key& key); |
3 通过键删除 |
2.4 Map的元素访问
1. 通过key和引用访问
char &e = map1[2]; e = |
需要注意的是,通过下标访问的方法和插入操作在语法上没有区别,如过使用了一个没有被定义过的键,则会创建一个新的键值对,这通常不是我们所说希望的。因此有第二种方案。
2. 通过成员函数和迭代器
map.count(k) |
返回map中键k的出现次数(对于map而言,由于一个key对应一个value,因此返回只有0和1,因此可以用此函数判断k是否在map中) |
map.find(k) |
??返回map中指向键k的迭代器,如果不存在键k,则返回超出末端迭代器(map1.end())。 |
2.5 Multimap
和Map基本一致,但是允许出现重复的Key。由于可以出现重复的Key,在Map中可以进行的[]访问和[]插入操作将不能进行而只能通过迭代器和insert()的方式去执行。
三、Set
Set也是一种关联容器,存储的对象可以看做是既作为Key又作为Value。Set和Map非常相似。它实现了红黑树的搜索结构。
同理,Set中所存储的键对象必须是可排序的,默认采用从小到大的排序方式(必须有operator<)。也可以通过函数对象的方式进行指定。set的标准头为:
template <class _Kty,class _Pr = less<_Kty>,class _Alloc = allocator<Pair< _Kty>>> class map {...} |
其中的less<_Kty>是一个函数式对象,代表了排序函数,分配器通常为默认分配器。
3.1 Set的创建
通过迭代器/指针创建并初始化。
struct betterthan{ ????bool ????????return a1>a2?1:0; ????} } const ????‘a‘,‘b‘,‘c‘ } std::set<char,betterthan> set1(item,item+3); |
3.2 Set的元素插入
通过insert成员函数
set1.insert(‘d‘); |
3.3 Set的元素删除
iterator erase(iterator it); |
1 通过一个条目对象删除 |
iterator erase(iterator first, iterator last);???????? |
2 删除一个范围 |
size_type erase(const Key& key); |
3 通过键值直接删除 |