目录

关联式容器
| 特性 | 序列式容器 vector/list | 关联式容器 map/set |
|---|---|---|
| 顺序 | 插入顺序 | key 排序 |
| 结构 | 线性排列 | 红黑树 |
| 查找 | O (n) 慢 | O (log n) 快 |
| 元素 | 单个值 | key/key+value |
| 排序 | 不会自动排 | 自动排序 |
| 用途 | 存数据、遍历 | 查找、映射、去重 |
序列式容器:map/set
STL总共实现了两种不同结构的管理式容器:树形结构和哈希结构。树形结构的关联式容器主要有四种:map、set、multimap、multiset 。共同点都是用平衡搜索树,即红黑树作为底层结构,容器中的元素是一个有序的序列。
键值对
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value代表与key对应的信息。如英文单词和其中文含义就是一个一一对应的关系,就可以把英文单词当做key,中文含义当做value。
cpp
//SGI 版 STL 中的实现
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) {}
};
pair中的first表示键值,second表示实值,即一一对应的关系。
构造一个匿名键值对pair对象,可以如下表示:
cpp
pair<string, string>{"left","左边"};
库里面写了一个函数模板:make_pair ,作用就是:自动帮你创建一个 pair 对象。
如:
cpp
make_pair("right","右边");
map -> key/value搜索树
对map的使用
cpp
void Testkeyvalue3()//使用map
{
map<string, string> dict;
pair<string, string> kv1("hello","你好" );
dict.insert(kv1);//insert插入的参数就是pair键值
dict.insert(pair<string, string>{"left","左边"});//匿名对象
dict.insert(make_pair("right","右边"));//使用make_pair(),实际是函数模板,即可不用指定传参类型
//pair<string, string> kv2 = { "apple","苹果" }; 多参数的构造函数支持隐式类型转换
//dict.insert(kv2);这两行就分别是构造+拷贝构造
dict.insert({ "apple","苹果" });//构造和拷贝构造优化为直接构造
//会按key的大小进行插入
//对map的遍历输出
//auto it1 = dict.begin();
//while (it1 != dict.end())
//{
// //cout << (*it1).first << "->" << (*it1).second << endl;
// cout << it1->first << "->" << it1->second << endl;//常用
// it1++;
//}
string str;
while (cin >> str)
{
auto s = dict.find(str);
if (s != dict.end())//不等于相当于找到了str的位置,find找不到时返回的就是end迭代器
{
cout << str << "->" << s->second << endl;
}
else
{
cout << "无此单词,请重新输入" << endl;
}
}
}
迭代器重载了 * 和-> 运算符 ,所以可以直接当成指针来使用。
(*it1).first:*it1是对迭代器的解引用,
● .first:访问这个键值对的键
● .second:访问这个键值对的值
it1->first:-> 是指针访问成员运算符,it1->返回的是operator->,即pair *
相当于:(it1.operator->())->first
operator[]
形式:
cpp
mapped_type& operator[] (const key_type& k);//即参数值是key,返回值是value

\]的功能等价于: 解释一下: 先看insert这块: mapped_type(),一个缺省值,不写的话相当于调用的是默认构造 insert的格式: 它的返回值是个pair,分为两种情况: 1. 当map中要插入一个`新的key`时,此时返回值就是`<新插入元素的迭代器,true>` 2. 当map中`已经存在一个key`时,此时返回值就是`