从矢量中取出某些内容并更改其值的最简单方法是什么?这不符合我的预期。
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 ++。
答案 0 :(得分:9)
someType s = list.at(i);
您正在索引i
处制作元素的副本。在C ++中,如果您想要引用某些内容,则需要明确声明您需要引用:
someType& s = list.at(i);
// ^ I'm a reference
正如现在所写的那样,你只能操纵你制作的副本,而不是容器中的对象。
答案 1 :(得分:4)
标准C ++库中没有“ArrayList”。我猜你使用的是std::vector
,std::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;
}
您可以将此引用视为列表元素的“别名”。