Не сдвигается итератор при использовании 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 шт):
На итераторах от std::list операторы +/- не работают. Их не добавили потому, что они работали бы за линейное время, и с их помощью можно было бы случайно написать неэффективный код.
Зато ++/-- работают. Сохраните ctn.end() в переменную и каждый раз сдвигайте на одну позицию. *(it+1) перепишите через std::next.