目录
一、map的使用
1.1map模板参数
1.2map的构造函数及迭代器
1.3map的容量与元素访问
1.4map中的增删查改
二、日常实操
一、map的使用
C++STL详解:set
通过对set的简单了解,我们可以知道,set就类似于二叉搜索树的key模型,而map对应的则是<key,value>模型。
1.1map模板参数
key: 键值对中key的类型。
T: 键值对中value的类型。
Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)。
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器。
注意:在使用map时,需要包含头文件。
1.2map的构造函数及迭代器
函数声明
|
功能介绍
|
map()
|
构造一个空的
map
|
begin()
和
end()
|
begin:
首元素的位置,
end
最后一个元素的下一个位置
|
cbegin()
和
cend()
|
与
begin
和
end
意义相同,但
cbegin
和
cend
所指向的元素不
能修改
|
rbegin()
和
rend()
|
反向迭代器,
rbegin
在
end
位置,
rend
在
begin
位置,其
++
和
--
操作与
begin
和
end
操作移动相反
|
crbegin()
和
crend()
|
与
rbegin
和
rend
位置相同,操作相同,但
crbegin
和
crend
所
指向的元素不能修改
|
1.3map的容量与元素访问
函数声明
|
功能简介
|
bool empty ( ) const
|
检测
map
中的元素是否为空,是返回
true
,否则返回
false
|
size_type size() const
|
返回
map
中有效元素的个数
|
mapped_type& operator[] (const
key_type& k)
|
返回去
key
对应的
value
|
注意:在元素访问时,有一个与operator[]类似的操作at()(该函数不常用)函数,都是通过
key找到与key对应的value然后返回其引用,不同的是:当key不存在时,operator[]用默认
value与key构造键值对然后插入,返回该默认value,at()函数直接抛异常。
1.4map中的增删查改
函数声明
|
功能简介
|
pair<iterator,bool> insert (
const value_type& x )
|
在
map
中插入键值对
x
,注意
x
是一个键值
对,返回值也是键值对:
iterator
代表新插入
元素的位置,
bool
代表释放插入成功
|
void erase ( iterator position )
|
删除
position
位置上的元素
|
size_type erase ( const
key_type& x )
|
删除键值为
x
的元素
|
void erase ( iterator first,
iterator last )
|
删除
[first, last)
区间中的元素
|
void swap (
map<Key,T,Compare,Allocator>&
mp )
|
交换两个
map
中的元素
|
void clear ( )
|
将
map
中的元素清空
|
iterator find ( const key_type& x
)
|
在
map
中插入
key
为
x
的元素,找到返回该元
素的位置的迭代器,否则返回
end
|
const_iterator find ( const
key_type& x ) const
|
在
map
中插入
key
为
x
的元素,找到返回该元
素的位置的
const
迭代器,否则返回
cend
|
size_type count ( const
key_type& x ) const
|
返回
key
为
x
的键值在
map
中的个数,注意
map
中
key
是唯一的,因此该函数的返回值
要么为
0
,要么为
1
,因此也可以用该函数来
检测一个
key
是否在
map
中
|
二、日常实操
#include <string>
#include <map>
void TestMap()
{
map<string, string> m;
// 向map中插入元素的方式:
// 将键值对<"sheep","浇给">插入map中,用pair直接来构造键值对
m.insert(pair<string, string>("sheep", "浇给"));
// 将键值对<"sheep","浇给">插入map中,用make_pair函数来构造键值对
m.insert(make_pair("banan", "香蕉"));
// 借用operator[]向map中插入元素
/*
operator[]的原理是:
用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中
如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器
如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器
operator[]函数最后将insert返回值键值对中的value返回
*/
// 将<"apple", "">插入map中,插入成功,返回value的引用,将“苹果”赋值给该引
用结果,
m["apple"] = "苹果";
// key不存在时抛异常
//m.at("waterme") = "水蜜桃";
cout << m.size() << endl;
// 用迭代器去遍历map中的元素,可以得到一个按照key排序的序列
for (auto& e : m)
cout << e.first << "--->" << e.second << endl;
cout << endl;
// map中的键值对key一定是唯一的,如果key存在将插入失败
auto ret = m.insert(make_pair("sheep", "浇给"));
if (ret.second)
cout << "<sheep, 浇给>不在map中, 已经插入" << endl;
else
cout << "键值为peach的元素已经存在:" << ret.first->first << "--->"
<< ret.first->second << " 插入失败" << endl;
// 删除key为"apple"的元素
m.erase("apple");
if (1 == m.count("apple"))
cout << "apple还在" << endl;
else
cout << "apple被吃了" << endl;
}
1. map中的的元素是键值对。
2. map中的key是唯一的,并且不能修改。
3. 默认按照小于的方式对key进行比较。
4. map中的元素如果用迭代器去遍历,可以得到一个有序的序列。
5. map的底层为平衡搜索树(红黑树),查找效率比较高O(log_2 N)。
6. 支持[]操作符,operator[]中实际进行插入查找。