Мои итераторы не работают так, как они должны работать - PullRequest
1 голос
/ 04 марта 2020

Так что это мой код для сортировки по выбору и по какой-то причине в той части, где я поменяю местами два элемента, он не работает и выдает всевозможные странные результаты.

vector<int> vect{45,32,12,1,67,34,2,15,33,40};
for(auto i=vect.begin();i<vect.end()-1;i++){
    auto min=i;
    for(auto j=i+1;j<vect.end();j++)
    {
        if(*min>*j)
        {
            min=j;
        }
    }
    *i=*i+*min;
    *min=*i-*min;
    *i=*i-*min;
}
for(int x:vect)
{
    cout<<x<<" ";
}

Но когда я использую другой способ поменять вывод получается правильным.

int temp=*min;
*min=*i;
*i=temp;

вместо: -

*i=*i+*min;
*min=*i-*min;
*i=*i-*min;

Пожалуйста, помогите мне выяснить, где произошла ошибка.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Добро пожаловать в C ++!

Ваша главная проблема здесь в том, что есть случай, когда итератор i указывает на тот же объект, что и итератор min.

Что вы действительно получите, так это

    *i=*i+*i;
    *i=*i-*i;
    *i=*i-*i;

Следовательно, вы получите нулевой результат!

Чтобы исправить это, вы не должны менять местами, когда итераторы равны.

vector<int> vect{45,32,12,1,67,34,2,15,33,40};
for(auto i=vect.begin();i<vect.end()-1;i++){
    auto min=i;
    for(auto j=i+1;j<vect.end();j++)
    {
        if(*min>*j)
        {
            min=j;
        }
    }
    if (i==min) continue; // ADD THIS
    *i=*i+*min;
    *min=*i-*min;
    *i=*i-*min;
}
for(int x:vect)
{
    cout<<x<<" ";
}

С наилучшими пожеланиями!

1 голос
/ 04 марта 2020

Вам всегда нужна временная переменная, чтобы поменять местами два элемента. Точно так же, как если вы хотите поменять две чашки, вам нужна третья.

...