在这个小小的测试程序中,有人可以解释一下:
为什么一个循环与另一个循环不同?
struct A {
A(){ std::cout << &v << "\n"; };
int v;
};
int main()
{
std::vector<A> vec;
int i = 10;
while (i--)
vec.push_back(A());
for (A b : vec)
std::cout << &(b.v) << "\n";
while (true);
return 0;
}
我实际上希望看到十次不同的地址重复2次
答案 0 :(得分:1)
在此基于循环的范围内:
for (A b : vec)
std::cout << &(b.v) << "\n";
b
是向量中元素的副本。这就是为什么你看到10倍相同的地址。两个不同的循环是不同的,因为该副本恰好位于不同的内存位置。你可能想要这个:
for (A& b : vec)
std::cout << &(b.v) << "\n";
此处b
是对向量中元素的引用。
答案 1 :(得分:1)
如果要查看相同的地址,则需要查看向量内的地址,而不是临时副本的地址。
使用vector::emplace_back
,您可以在构建期间查看向量内的地址(请参阅emplace_back)。参考访问在迭代期间为您提供向量内的地址。
int main()
{
std::vector<A> vec;
int i = 10;
while (i--)
vec.emplace_back();
for (const A& b : vec)
std::cout << &(b.v) << "\n";
...
}