map 字典 映射
map是一个关系式容器,以模版的方式实现。
map的底层是一个红黑树结构
map由键(key)和值(value)组成
map里所有的key都是有序的,并且不会存在重复。
map是一个容器,容器里面存放元素,把这个元素分成两个逻辑块。
第一个逻辑块叫key,第二个逻辑块叫value,他们一一对应。这两个区块当成一个组来管理。
每一个节点的内容都是由一个pair构成。
原型是一个类模版:
template <template k,template v>
class pair{
public:
k first;
v seconed;
pair(k& first,v& seconed):first(first),seconed(seconed){}
}
//通过函数构造
pair<K,V> make_pair(K key,V value);
map
map
插入数据:
m.insert(pair<int,string>(66,"zhangsan");
m.insert(make_pair(67, "张三"));
m.insert({69,"李四"});
访问数据:
cout<<m.at(66)<<endl;
cout<<m[66]<<endl;
注意,at不能修改数据,【】能修改数据,但使用【】时可能会产生新的节点,容易发生错乱,所以,一般来说只用【】来修改数据。如果,【】修改数据时没有找到key,则会新增一个节点。
m[66]=("小明");
【】和insert的区别;
insert不能够插入重复的数据,如果数据重复了,就插入无效。
【】能够插入重复的数据,如果插入重复的数据,则修改原本的数据。
map迭代器不能进行 + 和 - 运算符操作
可以使用 ++ – 运算符进行遍历
map常见用途
//for循环遍历
for(map<T1,T>::iterator iter=m.begin();iter!=end();iter++)
{ cout<<iter->first<<":"<<iter->seconed<<endl; }
//foreach遍历
for (auto e:map)
{ cout<<e.first<<":"<<e.seconed<<endl; }
//插入一个元素
void insert()
m.erase(55);
//查找一个元素;
m.find(66);
//通过key访问或修改数据
m.at(66);
iterator begin(); //返回指向map头部的迭代器
iterator end(); //返回指向map末尾的迭代器
reverse_iterator rbegin(); //返回一个指向map尾部的逆向迭代器
reverse_iterator rend(); //返回一个指向map头部的逆向迭代器
const_reverse_iterator crbeing();
const_reverse_iterator crend();
int size(); // 返回map中元素的个数
long max_size(); // 返回可以容纳的最大元素个数
void clear(); // 删除所有元素
int count(); // 返回指定key出现的次数 map中key只会出现一次,所以只会返回1或者 是0
void empty(); // 判断容器是否为空,如果map为空则返回true
void swap(); // 交换两个map内的元素
void lower_bound(); // 返回键值>=给定元素的第一个位置
void upper_bound(); // 返回键值>给定元素的第一个位置
void get_allocator(); // 返回map的配置器
void equal_range(); // 返回特殊条目的迭代器对
void key_comp(); // 返回比较元素key的函数
void value_comp(); // 返回比较元素value的函数
有序性:map的底层是红黑树自身是有序的,不停的插入元素,总是获得有序的数据。
时间复杂度低:底层结构为红黑树,红黑树的很多操作都是在log(n)的时间复杂度下实现的 ,因此效率高。
缺点:空间占用率高,红黑树的关系,每一个节点都需要额外保存,这样使得每一个节点都需要大量空间。
特点:
key的值可以重复,key的值仍然会排序;
不可以通过键的值进行访问
不可以at()
不可以operator[]
#include
特点:
key的值不会重复,key的值不会排序,但是会去重。
优点:内部的结构是哈希表,查找0(1),效率高。
缺点:哈希表的建立耗费时间。
应用场景:对于频繁的查找,用unordered_map更高效。
底层是一个哈希表值。
unordered_map记录元素的hash值,根据hash值判断元素是否相同。
与map的函数操作基本一致。
特点:
该容器既不排序也不去重。
底层是一个哈希表
用法与map相似。
虽然不会排序,但是重复的数据会被排列在一起。
头文件#include #include
set容器相比其他容器,没有value值,而只有key值
熟悉map,multimap,unorderd_multimap,unordered_map,set的特点,优点,缺点,底层实现。
熟悉map,multimap,unorderd_multimap,unordered_map,set的函数操作。
了解迭代器输出。