C++ 使用基于范围的for循环为向量赋值

C++ 使用基于范围的for循环为向量赋值,c++,c++11,C++,C++11,我试图使用for-each循环为向量赋值。如果在循环2中将值指定给x后打印这些值,则顺序正确 但当我打印在循环2中修改过的向量时,该向量保持不变。有人能解释一下吗 我试着使用正常的for循环,然后就没有问题了 不起作用的代码: #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> a

我试图使用for-each循环为向量赋值。如果在循环2中将值指定给
x
后打印这些值,则顺序正确

但当我打印在循环2中修改过的向量时,该向量保持不变。有人能解释一下吗

我试着使用正常的for循环,然后就没有问题了

不起作用的代码:

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

int main()
{
    vector<int> a = { -1, 150, 190, 170, -1, -1, 160, 180 };
    vector<int> v;

    // loop 1
    for (int x : a)
    {
        if (x != -1)
            v.push_back(x);
    }
    sort(v.begin(), v.end(), greater<int>());

    // loop2
    for (int x : a)
    {
        if (x != -1)
        {
            x = v.back();
            v.pop_back();
            cout << x << " ";
        }
        else
            cout << x << " ";
    }

    cout << endl << endl;

    // loop3
    for (int x : a)
        cout << x << " ";
}
预期结果:

-1 150 160 170 -1 -1 180 190

-1 150 160 170 -1 -1 180 190

问题在for循环中:

for(int x:a) { // (1)
    if(x!=-1)
    {   
        x=v.back(); // (2)
        v.pop_back();
        cout<<x<<" ";}
    else
        cout<<x<<" ";
}
那么x将是a中元素的引用,当x发生变化时,a中相应的元素也会发生变化。

什么是
(1)
-1 150 160 170 -1 -1 180 190

-1 150 160 170 -1 -1 180 190
for(int x:a) { // (1)
    if(x!=-1)
    {   
        x=v.back(); // (2)
        v.pop_back();
        cout<<x<<" ";}
    else
        cout<<x<<" ";
}
for(int& x : a)