std::list - как перемещаться по списку?
Извините, подскажите, а как перемещаться по элементам std:list ?
Перемещение используя итератор, как в std::vector или std::deque - поему то не работает.
std::vector<int>my_vector;
std::vector<int>::iterator my_vec_iter = my_vector.end() - 1; //Все нормально
std::list<int> my_list;
std::list<int>::iterator my_list_iter = my_list.end() - 1; //Ошибка
Ответы (3 шт):
Автор решения: Harry
→ Ссылка
vector — контейнер с произвольным доступом, а list — только с последовательным.
std::list<int> my_list;
std::list<int>::iterator my_list_iter = my_list.end();
--my_list_iter;
А с forward_list не получится даже этого...
Автор решения: Stanislav Volodarskiy
→ Ссылка
Используйте инкременты:
#include <iostream>
#include <list>
int main() {
std::list<int> list;
for (int i = 0; i < 10; ++i) {
list.push_back(i);
}
std::list<int>::iterator it = list.end();
while (it != list.begin()) {
--it;
std::cout << *it << ' ';
}
std::cout << '\n';
}
$ g++ -std=c++17 -pedantic -Wall -Wextra -Werror list_it.cpp $ ./a.out 9 8 7 6 5 4 3 2 1 0
Автор решения: KoVadim
→ Ссылка
Если очень хочется написать именно my_list.end() - 1;, то нужно просто использовать правильные функции - std::prev(my_list.end()). Эта функция перегружена правильно для разных контейнеров и может возвратить правильный итератор. Для forward_list оно не работает, но это и контейнер такой интересный, очень и очень урезанный.