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修饰。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程