改变矢量中的东西

时间:2010-10-29 03:45:14

标签: c++ vector

从矢量中取出某些内容并更改其值的最简单方法是什么?这不符合我的预期。

for(int i = 0; i < list.size(); i++) {
someType s = list.at(i);
s.x = 10;
s.y = 20;
s.z = 30;
}

但是,当我打印出someType s的x,y,z时,它并不能满足我的期望。对不起,我正在混淆Java和C ++。

4 个答案:

答案 0 :(得分:9)

someType s = list.at(i);

您正在索引i处制作元素的副本。在C ++中,如果您想要引用某些内容,则需要明确声明您需要引用:

someType& s = list.at(i);
     // ^ I'm a reference

正如现在所写的那样,你只能操纵你制作的副本,而不是容器中的对象。

答案 1 :(得分:4)

标准C ++库中没有“ArrayList”。我猜你使用的是std::vectorstd::vector<someType>

STL容器按值存储对象。该循环体内的第一行调用someType copy constructor ,因此您最终得到该对象的副本。该副本是automatically allocated,即它在堆栈中。您更新副本,然后它超出范围,并在迭代结束时destructed。矢量中保存的原始对象不变。

编辑:

当然我忘记了最后一点 - 使用引用(参见James的回答,你应该接受)。

答案 2 :(得分:2)

很可能你正在复制这些值。 如何定义清单?对象列表或对象指针列表? 确保使用&amp;作为列表项的“参考”。

T& s = list.at(i);
s.x = 0;
s.y = 1;

答案 3 :(得分:0)

您正在复制这些值;使用[default] copy-constructor复制每个对象。

我想更容易地引用列表中的元素,你应该使用reference s:

for(int i = 0; i < list.size(); i++) {
someType& s = list.at(i);
//      ^ This is a reference
s.x = 10;
s.y = 20;
s.z = 30;
}

您可以将此引用视为列表元素的“别名”。