如何通过map的value引用vector并修改原vector的值?
问题解答
你遇到的核心问题是:map里存的是原vector的副本,不是原对象本身。当你把examplevector放进map时,C++会自动创建一个新的vector对象,把原vector的内容复制进去。所以你修改map里的vector,只会改动这个副本,和原examplevector完全没关系。
要通过examplemap["vector1"]修改原examplevector的值,有两种常用方案:
方案1:让map存储指针
把map的类型改成指向vector的指针,存入原vector的地址,这样map里存的是原对象的“指向”,修改时直接操作原对象:
#include <iostream> #include <vector> #include <map> using namespace std; int main() { vector<string> examplevector {"one", "two", "three"}; map<string, vector<string>*> examplemap {{"vector1", &examplevector}}; (*examplemap["vector1"])[0] = "eight"; // 先解引用指针,再访问元素 cout << (*examplemap["vector1"])[0] << endl; // 输出 "eight" cout << examplevector[0] << endl; // 输出 "eight",原vector同步变更 }
方案2:使用引用包装器
如果不想用指针,可以用std::reference_wrapper,它能让容器存储对象的引用(C++容器本身不能直接存引用):
#include <iostream> #include <vector> #include <map> #include <functional> // 必须包含这个头文件 using namespace std; int main() { vector<string> examplevector {"one", "two", "three"}; map<string, reference_wrapper<vector<string>>> examplemap {{"vector1", examplevector}}; examplemap["vector1"].get()[0] = "eight"; // 用get()获取原始引用 cout << examplemap["vector1"].get()[0] << endl; // 输出 "eight" cout << examplevector[0] << endl; // 输出 "eight",原vector同步变更 }
注意要点
- 不管用指针还是引用包装器,都要保证原
examplevector的生命周期比map长,不然map里的指针/引用会变成无效的,访问时会触发未定义行为。
内容的提问来源于stack exchange,提问作者AhOkay
相关产品推荐
相关产品推荐

