2016-10-03 124 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