2016-10-03 91 views
-3

修改特定的项目,我想跟踪一个项目的一个载体,修改如下:在C++矢量

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目前有编译器生成的拷贝构造函数。

+3

或'&modThis '? – NathanOliver

+0

我打印了modThis和&v [2],它们不一样。 – imjojo42

+3

'v.push_back(myObj);'不会编译。请提供[mcve](http://stackoverflow.com/help/mcve),以便我们重现它。 – songyuanyao

回答

0

您应该使用矢量参考运算符以修改阵列中的对象。
正确的方法:

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

如果你的矢量持有指针则:

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

希望你这么做的时候,你打印`modThis`比较的地址,帮助

+0

有没有区别: 'vec.at(1).SetString(“mod”); ' and 'vec。[1] .SetString(“mod”); ' 他们是一样的,不是? – imjojo42

+0

他们是一样的。在这两种情况下,您都持有对数组中对象的引用,并且您直接操作此对象。 – PazO