Не сдвигается итератор при использовании operator+

Использую g++7

Основной код:

std::vector<int> vec = {5,3,6,14,5};
float arr[] = {5.0, 3.2, 12.1, 12.3, 18.0, 3.0, 12.7};
std::list<float> arrlst(arr, arr + sizeof(arr)/sizeof(float));

algo::Sort::Bubble(arrlst);

Функция algo::Sort::Bubble:

template < typename T,
            template <typename, typename...> class Container>
void algo::Sort::Bubble(Container<T>& ctn)
{
    try{

        if(ctn.end() == ctn.begin()) return;

        auto counter = 1;
        while(true){

            auto it = ctn.begin();
            for(; it != ctn.end() - counter; ++it);
                if(*it > *(it+1)) std::swap(*it,*(it+1));

            if(it == ctn.begin()) break;

            ++counter;
        }
    }
    catch(...){
        throw;
    }
}

Программа дает сбой в месте (функция Bubble):

for(; it != ctn.end() - counter; ++it);
   if(*it > *(it+1)) std::swap(*it,*(it+1));

При попытке добавить (сдвинуть итератор) к итератору какое-то число. В чем может быть причина? При работе с интовым вектором таких ошибок не возникает.

Вид ошибки: ** { "message": "no match for ‘operator+’ (operand types are ‘std::_List_iterator’ and ‘int’)" } **

Вроде, что-то с типом float и int. Но причем здесь он, это же сдвиг в пространстве адреса.


Ответы (1 шт):

Автор решения: HolyBlackCat

На итераторах от std::list операторы +/- не работают. Их не добавили потому, что они работали бы за линейное время, и с их помощью можно было бы случайно написать неэффективный код.

Зато ++/-- работают. Сохраните ctn.end() в переменную и каждый раз сдвигайте на одну позицию. *(it+1) перепишите через std::next.

→ Ссылка