You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何修改vector、list、unordered_map等容器内存储的对象?

问题解答

示例代码运行不符合预期的原因

Person类的getChildren()成员函数返回值为vector<Person>值类型,每次调用该函数时,都会生成内部children成员的全量拷贝,后续对这个临时拷贝的所有修改都不会作用到原对象的内部数据上,这就是你修改子对象姓名、添加孙对象都不生效的核心原因。

示例代码修复方法

只需将getChildren()的返回值修改为左值引用即可,修改后的代码如下:

// 原错误写法
// vector<Person> getChildren() {
//     return this->children;
// }

// 修改为返回引用
vector<Person>& getChildren() {
    return this->children;
}

// 额外补充const版本,供const对象调用
const vector<Person>& getChildren() const {
    return this->children;
}

修改后重新运行代码,即可得到你期望的输出。

unordered_map场景修改无效的问题说明

你之前遇到的at()方法返回引用但修改不生效的问题,和示例问题本质完全一致:

  • std::unordered_map::at()的返回值确实是存储值的左值引用,但如果你用值类型变量接收返回值(即B b = map.at(i);),会触发拷贝构造函数生成独立的局部对象,修改该对象当然不会影响map内的原始数据。
  • 正确写法为显式声明引用类型变量接收返回值:B& b = map.at(i);,后续对b的所有修改都会直接作用到map存储的对象上。
  • 如果使用find()方法,写法如下:
auto iter = map.find(i);
if (iter != map.end()) {
    B& target = iter->second; // 同样需要用引用接收
    // 直接修改target即可
}

你之前尝试用B*作为map值类型出现段错误,是因为存储了栈对象的地址,对象超出作用域销毁后指针变为野指针。如果需要使用指针存储,可以用std::unique_ptr<B>或std::shared_ptr<B>智能指针自动管理生命周期,避免内存问题。

内容的提问来源于stack exchange,提问作者qburke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:45:04