Присвоение значений вектору с использованием цикла for на основе диапазона - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь присвоить значения вектору, используя для каждого цикла. Если я распечатаю значения после присвоения их x в цикле 2, порядок будет правильным.

Но когда я печатаю вектор, который был изменен в цикле 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 Ответ

3 голосов
/ 15 июня 2019

Проблема в цикле 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, если он изменен, также изменяется соответствующий элемент в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...