C++ map 简介
C++ map 提供的是一种键值对容器,里面的数据都是成对出现的,每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次,第二个称之为该关键字的对应值(Value)。
Key | Value |
---|---|
prince | 5 |
weight | 10 |
map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。
map 操作函数
我们先按照常规的增删改查看看map的相关函数,然后我们在看看剩余的一些函数。首先,你要先包含这个头文件!
#incldue <map>
map 构造函数
- 常规构造函数
std::map<std::string,int> apple;
- 模板类构造函数
typedef std::map<std::string,int> FRUIT;
FRUIT apple;
map 添加函数
- 数组方式插入数据
apple["prince"] = 5;
apple["weight"] = 10;
- insert 函数插入 pair 数据
apple.insert(std::pair <std::string,int> ("price",5));
apple.insert(std::pair <std::string,int> ("weight",10));
- insert 函数插入 value_type 数据
apple.insert(std::map <std::string,int>::value_type ("price",5));
apple.insert(std::map <std::string,int>::value_type ("weight",10));
// 如果前面构造函数采用模板类构造函数的话,你也可以这样做
apple.insert(FRUIT::value_type ("price",5));
apple.insert(FRUIT::value_type ("weight",10));
map 查找函数
- find()函数
find() 函数返回一个迭代器指向键值为 key 的元素,如果没找到就返回指向 map 尾部的迭代器。
std::map<std::string,int>::iterator it = apple.find("price");
if(it == apple.end())
std::cout << "we don't find price" << std::endl;
else std::cout << it->first << ":" << it->second << std::endl;
- [ ]下标索引
按照map中的key值进行索引查找,但是这种方法可能导致向map中添加该下标所指向的新元素,其值会根据类型默认值或默认构造函数进行初始化
cout << apple["weight"] <<endl;
/*********************************************
打印输出map顺序如下
10
price:5
weight:10
**********************************************/
cout << apple["weigt"] <<endl;
/*********************************************
打印输出map顺序如下
0
price:5
weight:10
weigt:0
**********************************************/
- map.at()查找
该函数提供的查找功能可用于Key的取值,但它会进行越界检测,这会损失一定的效率。如果查找的Key存在,则返回它的值,如果不存在,则抛出异常。
try
{
std::cout << apple.at("price") << std::endl;
std::cout << apple.at("yellow") << std::endl;
}
catch (std::exception& e)
{
cout << "catch exception: " << e.what() << endl;
}
/*********************************************
打印结果如下
5
catch exception: map::at
**********************************************/
- count()函数
该函数用来返回map中Key出现的次数,因为map不存在相同元素,所以返回值为0或1,为0表示不存在,只能用来判断Key是否存在。
int num_price = apple.count("price");
int num_yellow = apple.count("yellow");
std::cout << num_price << " ||||| " << num_yellow << std::endl;
/*********************************************
打印结果如下
1 ||||| 0
**********************************************/
map 删除函数
- 删除键值所对应的元素=成员函数 erase()
该函数的返回值为删除的元素个数,这个可以根据需要自行处理
//size_type erase (const key_type& k);
apple.erase({"weight"});
// 也可以采用以下方式
std::string key{"weight"};
apple.erase(key);
- 删除迭代器 key所指向的元素
std::map<std::string,int>::iterator key= apple.find("price");
// key也可以采用以下方式
FRUIT::iterator key= apple.find("price");
if(key!=apple.end())
{
apple.erase(key);
}
- 删除某个范围内的元素
删除区间是一个前闭后开的集合, map 中的元素是自动按 key 升序排序,所有我们查找范围的时候还得先确定哪个Key在前,哪个Key在后,然后才能将这个范围提供给函数进行删除,否则就会程序报错。
apple.insert(FRUIT::value_type ("price",5));
apple.insert(FRUIT::value_type ("weight",10));
apple.insert(FRUIT::value_type ("number",15));
apple.insert(FRUIT::value_type ("lever",3));
/*********************************************
打印输出map顺序如下
lever:3
number:15
price:5
weight:10
**********************************************/
FRUIT::iterator it_start = apple.find("price");
FRUIT::iterator it_end = apple.find("weight");
apple.erase(it_start,it_end);
/*********************************************
程序执行后打印输出map顺序如下
lever:3
number:15
weight:10
**********************************************/
另外,如果想删除第一个元素和最后一个元素之间的所有元素,可以这样做
apple.erase(++std::begin(apple), --std::end(apple));
/*********************************************
程序执行后打印输出map顺序如下
lever:3
weight:10
**********************************************/
- 删除所有元素
apple.clear();
// 也可以采用以下方式,这些执行后都是可以清空map元素的
apple.erase(std::begin(apple), std::end(apple));
apple.erase(apple.begin(), apple.end());
map 修改函数
暴力修改:参考添加函数中用数组方式插入数据来达到目的
// 通过强制赋值来达到修改map元素的目的
apple["price"] = 10;
map 其他函数
// 为了展示函数效果,我们先在map中填入两组数据
apple.insert(FRUIT::value_type ("price",5));
apple.insert(FRUIT::value_type ("weight",10));
banana.insert(FRUIT::value_type ("number",20));
banana.insert(FRUIT::value_type ("lenth",10));
- empty()
如果 map 为空则返回 true
if(apple.empty())
std::cout << "map is empty " << std::endl;
else std::cout << "map is not empty " << std::endl;
/*********************************************
打印结果如下
map is not empty
**********************************************/
- size()
返回map中元素的个数
std::cout << "map size is " << apple.size()<< std::endl;
/*********************************************
打印结果如下
map size is 2
**********************************************/
- max_size()
返回可以容纳的最大元素个数
std::cout << "map size is " << apple.max_size()<< std::endl;
/*********************************************
打印结果如下
map size is 256204778801521550
**********************************************/
- swap()
交换两个map
apple.swap(banana);
/*********************************************
打印结果如下
apple :lenth:10
apple :number:20
banana :price:5
banana :weight:10
**********************************************/
另外map还有一些其他的操作函数,博主觉得不太常用,就不一一列举了,有兴趣的同学可以自行查找使用