【问题标题】:modify specific item in c++ vector修改 C++ 向量中的特定项
【发布时间】:2016-10-03 13:34:37
【问题描述】:

我想跟踪一个向量中的一项并修改如下:

vector<myObj> v;

myObj obj = myObj(params)
v.push_back(myObj);

obj = myObj(params)
v.push_back(myObj);

obj = myObj(params)
v.push_back(myObj);

myObj* modThis = &v[2];
//modify modThis

但是当我在我的真实代码中做这样的事情时,它只会修改对象的副本,而不是修改向量内的实际对象。我打印了 modThis 和 &v[2] 的地址,它们不一样!我也尝试过类似以下的方法:

myObj modThis = v[2]; 
//modiy myObj

这似乎也只是创建了对象的副本并继续修改副本而不是存储在向量中的原始对象。

如何在不复制项目的情况下访问向量内对象的修改?我错过了什么?

注意:myObj 当前具有编译器生成的复制构造函数。

【问题讨论】:

  • 比较地址时,您打印的是modThis 还是&amp;modThis
  • 我打印了 modThis 和 &v[2] ,它们不一样。
  • v.push_back(myObj); 不会编译。请提供mcve,以便我们重现它。
  • 在将&amp;v[2] 保存到modThis 后,您是否有机会向向量中添加或删除元素?这些操作使指向向量元素的部分或全部指针、引用和迭代器无效。

标签: c++ pointers vector reference


【解决方案1】:

您应该使用向量引用运算符来修改数组中的对象。
正确方法:

vec.at(1).SetString("Modified string");

如果你的向量持有指针,那么:

vec.at(1)-&gt;SetString("Modified string");

希望有帮助

【讨论】:

  • vec.at(1).SetString("mod"); vec.[1].SetString("mod"); 之间有区别吗?是一样的吗?
  • 它们是一样的。在这两种情况下,您都持有对数组中对象的引用,并且您正在直接操作该对象。
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 2015-05-06
  • 2021-09-24
  • 2011-02-07
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多