目录
1.关联式容器
2.键值对
3.树形结构的关联式容器
4.map的特点
5.使用map
常用接口的使用:
1.find
2.insert
3.erase
4.operator[ ]
6.multimap
1.关联式容器
与vector,list,queue等底层为线性序列的数据结构的序列式容器有着不同,关联式容器里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。与之相对,序列式容器中的元素是按照它们在容器中的位置来顺序保存和访问的。
2.键值对
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代
表键值,value表示与key对应的信息。比如:以一个人的名字为key值,再将他的手机号当作value值,这样我们就可以通关一个人的名字找到他对应的手机号。
3.树形结构的关联式容器
树形结构的关联式容器主要有四种:map, set, multimap, multiset。这四种容器的共同点是:使用平衡搜索树(红黑树)作为其底层结果,容器中的元素是一个有序的序列。
以下将主要介绍map容器。
4.map的特点
1.map是关键字-值对的集合。例如可以将一个人的名字作为关键字,将其电话号码作为值。我们称这样的数据结构为“将名字映射到电话号码”。map类型通常被称为关联数组。
2.map中的key是唯一的,并且不能修改。
3.默认按照小于的方式对key进行比较。
4.map的底层为平衡搜索树,所以使用map进行查找时效率比较高,时间复杂度为。
5.map中的元素如果用迭代器去遍历,可以得到一个有序的序列。
6.map重载了[ ]操作符,可以使用operator[ ]进行查找删除。
5.使用map
常用接口的使用:
1.find
成员类型iterator和const_iterator是指向(value_type类型)元素的双向迭代器类型。
#include <iostream>
#include <map>
using namespace std;
int main ()
{
std::map<char,int> mymap;
std::map<char,int>::iterator it;
mymap['a']=50;
mymap['b']=100;
mymap['c']=150;
mymap['d']=200;
cout << "a =>" << mymap.find('a')->second << endl;
cout << "b =>" << mymap.find('b')->second << endl;
cout << "c =>" << mymap.find('c')->second << endl;
cout << "d =>" << mymap.find('d')->second << endl;
return 0;
}
如果找到具有指定键的元素,则为该元素的迭代器,否则为map::end。
2.insert
#include <iostream>
$include <map>
int main()
{
map<string, string> dict;
dict.insert(pair<string, string>("sort", "排序"));
dict.insert(pair<string, string>("test", "测试"));
dict.insert(pair<string, string>("string", "111"));
dict.insert(make_pair("left", "左边"));
dict.insert(pair<string, string>("string", "XXXX"));
for (const auto& kv : dict)
{
cout << kv.first << ":" << kv.second << endl;
}
cout << endl;
return 0;
}
因为map中元素的键是唯一的,所以插入操作会检查每个被插入元素的键是否与容器中已经存在的元素的键相等,如果相等,则不插入该元素,并返回一个指向该元素的迭代器(如果该函数有返回值)。
3.erase
poison:指向从map中删除的单个元素的迭代器。
k :要从map中删除的元素的键(key)。
[first,lst):指定map容器内要删除的范围的迭代器:[第一个,最后一个)。也就是说,范围包括first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<char, int> mymap;
map<char, int>::iterator it;
// 插入值
mymap['a'] = 10;
mymap['b'] = 20;
mymap['c'] = 30;
mymap['d'] = 40;
mymap['e'] = 50;
mymap['f'] = 60;
it = mymap.find('b');
mymap.erase(it); // 通过迭代器进行删除
mymap.erase('c'); //通过键进行删除
it = mymap.find('e');
mymap.erase(it, mymap.end()); // 通过范围进行删除
// 显示内容
for (it = mymap.begin(); it != mymap.end(); ++it)
cout << it->first << " => " << it->second << end;
return 0;
}
从map容器中删除单个元素或一组元素[first,last)(左闭右开)。
这可以有效地通过删除的元素(即被销毁的元素)减少容器的大小。
4.operator[ ]
1.map中有这个key,返回value的引用 (同时也可以通过此点查找和修改value)
2.map中没有这个key,会插入一个pair(key,v());返回value的引用。 (注意,即使没有映射值给元素(元素是使用其默认构造函数构造的),这样做也会使容器大小增加1。)
调用这个函数等价于:
(*((this->insert(make_pair(k,mapped_type()))).first)).second
// 访问map的值
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<char, string> mymap;
mymap['a'] = "an element";
mymap['b'] = "another element";
mymap['c'] = mymap['b'];
cout << "mymap['a'] is " << mymap['a'] << '\n';
cout << "mymap['b'] is " << mymap['b'] << '\n';
cout << "mymap['c'] is " << mymap['c'] << '\n';
cout << "mymap['d'] is " << mymap['d'] << '\n';
cout << "mymap now contains " << mymap.size() << " elements.\n";
return 0;
}
注意,最后一次访问元素'd'时,使用该键在map中插入了一个新元素,并初始化为其默认值(空字符串),尽管访问它只是为了获取其值。而成员函数map::find不会产生这种效果。
6.multimap
1. Multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key,
value>,其中多个键值对之间的key是可以重复的。
2. 在multimap中,通常按照key排序和惟一地标识元素,而映射的value存储与key关联的内
容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,
value_type是组合key和value的键值对:
typedef pair<const Key, T> value_type;
3. 在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对
key进行排序的。
4. multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代
器直接遍历multimap中的元素可以得到关于key有序的序列。
5. multimap在底层用二叉搜索树(红黑树)来实现。
注意:multimap和map的唯一不同就是:map中的key是唯一的,而multimap中key是可以
重复的。multimap未重载[ ](因为允许存在多个key)。