使用基于范围的for循环填充指针向量

Avi*_*iss 1 c++ for-loop ranged-loops

这个用向量元素的地址填充指针向量的代码v工作正常:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v{ 1,2,3,4,5 };
    vector<int*> pv;
    for (unsigned int i = 0; i < size(v); i++)
        pv.push_back(&(v[i]));
    for (auto i : pv)
        cout << i << " ";
    cout << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何使用基于范围的for循环获得相同的结果.我尝试过这样的代码,但它不能正确填充指针的向量:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v{ 1,2,3,4,5 };
    vector<int*> pv;
    for (auto i : v)
        pv.push_back(&i);
    for (auto i : pv)
        cout << i << " ";
    cout << endl;
}
Run Code Online (Sandbox Code Playgroud)

我确信我有一些非常简单的错误 - 但是在搜索了一下之后却无法解决这个问题.感谢大家!

小智 5

参考元素:

for (auto& r : v)
    pv.push_back(&r);
Run Code Online (Sandbox Code Playgroud)

您原始的基于范围的for循环按值迭代向量,使i每个项目成为每个项目的新副本.因此表达式&i不检索内部元素的地址v.

通过引用迭代,每个r引用内部的元素v,因此表达式&r的地址正确地检索元素的地址.