#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 исправляет ситуацию ?
Вы двигаете оба итератора одновременно. При четном количестве элементов они могут "разминуться". Ваш 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;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей