簡體   English   中英

使用基於范圍的for循環將值分配給矢量

[英]Assigning values to a vector using a range-based for-loop

我正在嘗試使用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 << " ";
}

當循環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

問題出在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中的對應元素也會被改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM