一、map与multimap的区别等同于set 与multiset的区别。
map是关联容器,map 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同。
注意,不能直接修改 map 容器中的关键字。因为 map 中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。
要使用map,必须包含
二、map功能
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
快速插入Key -Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。
map的第一个关键字,也就是key,每个key只能在map中出现一次。
map的第二个参数,也称为对应key的值。
map内部数据排列其实是内部自建一颗红黑树(非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,红黑树的特点是增加和删除节点对迭代器的影响很微弱,操作的话只对操作节点有影响。
对于迭代器来说,可以修改实值,而不能修改key。
template < class Key, class T, class Pred = less, class A = allocator >
class map{
...
typedef pair< const Key, T > value_type;
...
};
map 和 multimap 十分类似,区别在于 map 容器中元素的关键字不能重复。multimap 有的成员函数,map 都有。此外,map 还有成员函数 operator[]:
T & operator[] (Key k);
该成员函数返回 first 值为 k 的元素的 second 部分的引用。如果容器中没有元素的 first 值等于 k,则自动添加一个 first 值为 k 的元素。如果该元素的 second 成员变量是一个对象,则用无参构造函数对其初始化。
#include
#include
要访问关键字为 40 的元素。在没有这个元素的情况下,一个关键字为 40、值为 0 的元素被自动插入容器。mp[40] 等价于mp.operator[](40);
,其返回值是关键字为 40 的那个元素(不论是原有的还是新插入的)的 second 成员变量的引用。后面两行的道理与此类似。
三、Map常用函数
C++ maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是 1或0。
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
四、迭代器
map::iterator t;
for(t=p.begin();t!=p.end();t++)
{......
.....}
//前向迭代器、反向迭代器、数组形式输出
for(it = int_str.begin(); it != int_str.end(); it++) //正向输出
cout<first<<' '<second<::reverse_iterator iter;
for(iter = int_str.rbegin(); iter != int_str.rend(); iter++) //反向输出
cout<first<<" "<second<