一、关联式容器概念
1、关联式容器
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存放的是<key,value>结构的键值对,在数据检索时比序列式容器效率更高。
2、键值对
用来表示具有一一对应关系的一种结构,该结构中包含两个成员变量 key 和 value ,key 表示键值,value 表示与 key 所对应的信息。
template<class T1,class T2>
struct pair{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair()
:first(T1())
,second(T2())
{}
pair(const T1& a, const T2& b)
:first(a)
, second(b)
{}
};
二、树形结构的关联式容器
根据应用场景的不同,STL共实现了两种不同结构的管理式容器:树型结构与哈希结构。树形结构的关联式容器主要有四种: map 、set 、multimap 、 multiset。这四种容器的共同点是:使用平衡二叉搜索树(即红黑树)作为其底层的结果,容器中的元素是一个有序的序列。
1、map
1、map的介绍
- map是一种关联式容器,他按照特定的次序(按照key来比较)存储key值和value值组合而成的元素;
- 在map中,键值key通常用于排序和惟一的标识元素,而值value 中存储与此键值key 关联的内容。键值 key 和 值value的类型可能不同,并且在map 的内部,key 与 value 通过成员类型 value_type绑定在一起,为其取别名称为 pair;
- 在内部,map中的元素总是按照键值 key 进行比较排序的;
- map中通过键值访问单个元素的速度通常比 unorder_map 容器慢,但 map 允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列);
- map支持下标访问符,即在[ ]中放入 key,就可以找到与 key对应的 value;
- map通常被实现为平衡二叉搜索树(红黑树);
2、map的使用
void MapTest() {
map<string, string> m;
//插入数据
m.insert(pair<string, string>("peach", "桃子"));
m.insert(make_pair("banana","香蕉"));
m["apple"] = "苹果";
cout << m.size() << endl;
//用迭代器去遍历 map 中的元素,可以得到一个按照 key 排列的序列
for (auto x : m)
cout << x.first << "--->" << x.second << endl;
cout << endl;
//map 中的键值对 key 是唯一的,如果 key 存在将插入失败
auto ret = m.insert(make_pair("peach","桃子"));
if (ret.second)
cout << "<peach,桃子>不在map中,以及插入" << endl;
else
cout << "已存在,插入失败" << ret.first->first << "--->"
<< ret.first->second << "failed" << endl;
//删除 key 为"apple"的元素
m.erase("apple");
if (m.count("apple") == 1) {
cout << "Have" << endl;
}
else
cout << "Nohave" << endl;
}
operator[ ]的原理是:
用<key,value()>构造一个键值对,然后调用insert()函数将该键值对插入到 map中;
如果key 已经存在,插入失败,insert 函数返回该 key 所在位置的迭代器;
如果key 不存在,插入成功,insert 函数返回新插入元素所在位置的迭代器;
operator[ ]函数最后将insert 返回值是将键值对中的 value 返回;
扫描二维码关注公众号,回复:
8492234 查看本文章
3、map的总结
- map 中的元素时以键值对的方式给出的;
- map 中的key 是唯一的,并且不能进行修改;
- 默认按照小于的方式对key 进行比较;
- map 中的元素如果用迭代器去遍历,可以得到一个有序的序列;
- map 的底层为红黑树,查找效率比较高 O(log2N)
- 支持[ ]操作符,operator[ ]实际进行插入查找;
2、multimap
1、multimap的介绍
multimap 基本上和 是一样的,唯一的不同是:map 中的 key 是唯一的,而 multimap 中 key 是可以重复的;
2、multimap的使用
multimap 的接口参考 map,功能都是类似的;
3、multimap的总结
- multimap中的key 是可以重复的;
- multimap中的元素默认将 key 按照小于来比较;
- multimap中没有重载 operator[ ]操作;
- 使用时与 map 包含的头文件相同;