C++ STL库有序关联式容器我们已经学习完了。想必有不少读者存疑:能不能修改元素的键(key)呢?答案是肯定的,不能!为什么,就像是下标对于数组一样,是数组属性的一部分,键(key)对于有序关联式容器来说也是如此,键(key)关乎容器内元素的访问和排序,是基本的属性规则,不允许修改。其次,pair模板对象的底层是:

pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) { }

我们可以看到:键(key)被const 修饰,所以不能进行更改!那么要更改有序关联式容器内元素的键(key)有什么办法呢?答案也很简单,先删后改。比如我要修改map{{1,1},{2,2},{3,3}}中value=2的键(key),改其键(key)为0,则可通过代码这样实现:

#include <iostream>
#include<functional> 
#include<map>
#include<set> 
#include<utility>
using namespace std;
/*改value=2的键(key)为0*/ 
void test()
{
/*一般情况,先删后添*/
map<int,int>mp{{1,1},{2,2},{3,3}};
for(auto it = mp.begin();it!=mp.end();++it)
{
if(it->second == 2)
{
mp.erase(it->first);
}
}
mp.insert({0,2});
cout << "先删后添后让key=0来存储value=【" << mp.find(0)->second << "】" ;
}
int main() {
    test();
    return 0;
}

代码编译如下:

先删后添

这里我们先删后添,成功让key=0的键来存储2,对于multimap容器、set容器、multiset容器来说也是如此。

那假如是自定义数据类型呢,到底能不能修改键值!

答案也是肯定的,不能!这时候读者可能会想:只要不修改参与排序规则的那部分变量,应该没事吧。似乎有点道理,可是从宏观上看,整个自定义数据都被const修饰,所以连部分都不能更改。

总结:要想修改有序关联式容器内元素的键(key),只能两步走——先删后添;当自定义数据作为key时,对于不参与排序的那部分变量也是不能更改的,因为整个数据都被const修饰。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)