【编程语言---C++】你看这个map是不是挺好玩的

C++ map 简介

C++ map 提供的是一种键值对容器,里面的数据都是成对出现的,每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次,第二个称之为该关键字的对应值(Value)。

KeyValue
prince5
weight10

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还有一些其他的操作函数,博主觉得不太常用,就不一一列举了,有兴趣的同学可以自行查找使用
黎明就在眼前

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡泡吐泡泡啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值