Сравнение итераторов STL

279
07 января 2018, 07:00
#include <iostream>
#include <algorithm>
#include <list>
int main(/*int argc, char *argv[]*/)
{
    using lisst = std::list<int>;
    lisst mylist;
    for(int i = 0; i < 9; ++i)
    {
        mylist.push_back(i + (i*i));
    }
    for(int & x : mylist) std::cout << x << ' ';
    std::cout << "\n\n";
    lisst::iterator b_it = mylist.begin();
    lisst::iterator e_it = mylist.end();
    --e_it;
    while(b_it != e_it) // ??????????
    {
        std::swap(*b_it, *e_it);
        ++b_it;
        if(b_it == e_it) break; // ??????????
        --e_it;
    }
    for(int & x : mylist) std::cout << x << ' ';
    return 0;
}

Вопрос: почему в цикле while проверка на равенство работает некорректно. Добавление условия if исправляет ситуацию ?

Answer 1

Вы двигаете оба итератора одновременно. При четном количестве элементов они могут "разминуться". Ваш if как раз этот случай и проверяет.

А вообще, раз уж вы подключили algorithm, то пользуйтесь им:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <list>
int main(/*int argc, char *argv[]*/)
{
    using lisst = std::list<int>;
    lisst mylist;
    for(int i = 0; i < 4; ++i)
    {
        mylist.push_back(i + (i*i));
    }
    std::copy(mylist.begin(), mylist.end(), std::ostream_iterator<int>(std::cout, " "));    
    std::cout << "\n\n";
    std::reverse(mylist.begin(), mylist.end());
    std::copy(mylist.begin(), mylist.end(), std::ostream_iterator<int>(std::cout, " "));    
    return 0;
}
READ ALSO
Как обучится этому? [требует правки]

Как обучится этому? [требует правки]

Ребят я начал углубляться в программирование,но увы есть много проблем с обучением1

275
Чтение чисел из файла с++ [требует правки]

Чтение чисел из файла с++ [требует правки]

Есть файл в нем числаВывести все числа удалив из них повторяющиеся цифры

269
Связный список С++

Связный список С++

Написал код создания, заполнения и вывода элементов связного списка:

276
Оператор возведения в степень?

Оператор возведения в степень?

Есть ли в С++ оператор возведения в степень? Можно ли его перегрузить?

259