使用基于范围的for循环将值分配给向量

时间:2019-06-15 12:47:19

标签: c++ c++11

我正在尝试使用for每个循环将值分配给向量。如果在循环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 << " ";
}

将循环2替换为:

for (int x = 0; x < a.size(); x++)
{
    if (a[x] != -1)
    {
        a[x] = v.back();
        v.pop_back();
    }
}

实际结果:

-1 150 160 170 -1 -1 180 190

-1 150 190 170 -1 -1 160 180

所需结果:

-1 150 160 170 -1 -1 180 190

-1 150 160 170 -1 -1 180 190

1 个答案:

答案 0 :(得分:3)

问题出在for循环中:

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

x是a中元素的副本,而不是直接元素。因此,当您更改x(2)时,将更改元素的副本,而不是矢量中的元素。

如果要更改向量中的元素,请执行

for(int& x : a)

然后x将成为a中元素的引用,并且如果x发生更改,则a中相应的元素也会被更改。