目录
1.概述
map是C++标准模板库(STL)中的一种关联式容器。它的特性是,所有元素都会根据元素的键值自动被排序,即map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素被视为键值,第二个元素被视为实值,且不允许两个元素拥有相同的键值。标准的STL map即以RB-tree为底层机制,map所开发的各种操作接口函数基本都是转调用RB-tree的操作行为。
2. map的基本操作
2.1 插入操作
下面是<stl_pair.h>中的pair定义:
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) {}
};
make_pair函数:
template pair make_pair(T1 a, T2 b) { return pair(a, b); }
map数据构造的方式示例:
map<int, string> stuMap;
stuMap[1001]="Jason";
stuMap.insert(pair<int, string>(1002,"Helen"));
stuMap.insert(make_pair(1003,"Steve"));
2.2 取值
Map中元素取值主要有at和[ ]两种操作,at会作下标检查,而[]不会。
//stuMap中没有关键字1004,使用[]取值会导致插入
//因此,下面语句不会报错,但打印结果为空
cout <<"stuMap[1004]:"<<stuMap[1004]<<endl;
//使用at会进行关键字检查,因此下面语句会报错
stuMap.at(1005) = "Bob";
2.3. 容量查询
// 查询map是否为空
bool empty();
// 查询map中键值对的数量
size_t size();
// 查询关键字为key的元素的个数,在map里结果非0即1
size_t count( const Key& key ) const; //
2.4 删除
// 删除迭代器指向位置的键值对,并返回一个指向下一元素的迭代器
iterator erase( iterator pos )
// 删除一定范围内的元素,并返回一个指向下一元素的迭代器
iterator erase( const_iterator first, const_iterator last );
// 根据Key来进行删除, 返回删除的元素数量,在map里结果非0即1
size_t erase( const key_type& key );
// 清空map,清空后的size为0
void clear();
2.5 查找
// 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器
// 根据map的类型,返回的迭代器为 iterator 或者 const_iterator
iterator find (const key_type& k);
const_iterator find (const key_type& k) const;
2.6 使用举例
#include <map>
#include <iostream>
#include <string>
using namespace std;
int main() {
map<int, string> stuMap;
cout<<"————————————————————插入操作—————————————————"<<endl;
stuMap[1001]="Jason";
stuMap.insert(pair<int, string>(1002,"Helen"));
stuMap.insert(make_pair(1003,"Steve"));
map<int, string>::const_iterator iter = stuMap.begin();
for (; iter != stuMap.end(); ++iter)
{
cout <<"id:"<< iter->first <<" name:"<< iter->second << endl;
}
cout<<"————————————————————取值操作—————————————————"<<endl;
cout <<"stuMap[1004]:"<<stuMap[1004]<<endl;
//使用at会进行关键字检查,因此下面语句会报错
//stuMap.at(1005) = "Bob";
cout<<"————————————————————容量查询—————————————————"<<endl;
cout<<"stuMap empty state is "<<boolalpha<<stuMap.empty()<<endl;
cout<<"stuMap size is "<<boolalpha<<stuMap.size()<<endl;
cout<<"stuMap.count(1008) is "<<boolalpha<<stuMap.count(1008)<<endl;
cout<<"————————————————————删除操作—————————————————"<<endl;
cout<<"before delete"<<endl;
iter = stuMap.begin();
for (; iter != stuMap.end(); ++iter)
{
cout <<"id:"<< iter->first <<" name:"<< iter->second << endl;
}
stuMap.erase(1004);
iter = stuMap.begin();
for (; iter != stuMap.end(); ++iter)
{
if(iter->second=="Helen")
{
stuMap.erase(iter);
break;
}
}
cout<<"after delete"<<endl;
iter = stuMap.begin();
for (; iter != stuMap.end(); ++iter)
{
cout <<"id:"<< iter->first <<" name:"<< iter->second << endl;
}
cout<<"————————————————————查找操作—————————————————"<<endl;
iter = stuMap.find(1001);
if (iter != stuMap.end())
{
cout <<"stuMap.find(1001) name:"<< iter->second << endl;
}
return 0;
}
执行结果:
[root@192 5_STL_associated_container]# ./5_4_map-test
————————————————————插入操作—————————————————
id:1001 name:Jason
id:1002 name:Helen
id:1003 name:Steve
————————————————————取值操作—————————————————
stuMap[1004]:
————————————————————容量查询—————————————————
stuMap empty state is false
stuMap size is 4
stuMap.count(1008) is 0
————————————————————删除操作—————————————————
before delete
id:1001 name:Jason
id:1002 name:Helen
id:1003 name:Steve
id:1004 name:
after delete
id:1001 name:Jason
id:1003 name:Steve
————————————————————查找操作—————————————————
stuMap.find(1001) name:Jason
3.map基本操作函数总结
map的基本操作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
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的函数