C ++: как отследить указатель на элемент списка STL? - PullRequest
3 голосов
/ 23 июля 2011

Я бы хотел отследить указатель на элемент списка для следующего доступа на чтение. Этот указатель будет продвигаться каждый раз, когда список будет прочитан. Будет ли плохой практикой кэшировать итератор в списке в качестве переменной-члена, если я приму соответствующие меры предосторожности при удалении элементов списка?

Ответы [ 4 ]

4 голосов
/ 23 июля 2011

Итератор элемента списка остается действительным до тех пор, пока элемент, на который он ссылается, не будет удален. Это гарантируется стандартом.

Нет проблем с кэшированием итератора, если вы уверены, что не удаляете элементы из списка и не обновляете кэшированный итератор, когда делаете это.

3 голосов
/ 23 июля 2011

Итераторы предназначены для использования.Они предназначены не только для зацикливания каждого элемента в цикле for.Все, что вы должны принять во внимание, это правила для аннулирования итераторов.

std::vector итераторы могут быть аннулированы любой операцией, которая вставляет элементы в список.Итераторы для всех элементов за пределами точки вставки становятся недействительными, и все итераторы становятся недействительными, если операция вставки вызывает увеличение емкости.Операция, удаляющая элемент из вектора, лишит законной силы любой итератор после точки удаления.

std::deque итераторы аннулируются любой операцией, которая добавляет или удаляет элементы из любой точки в очереди.Так что, вероятно, не очень хорошая идея хранить их очень долго. Итераторы

std::list, std::set и std::map становятся недействительными только из-за конкретного удаления конкретного элемента, на который ссылается итератор.Это самые долгоживущие типы итераторов.

Пока вы помните эти правила, не стесняйтесь хранить эти итераторы сколько хотите.Разумеется, хранить итераторы std::list неплохо, если вы уверены, что этот конкретный элемент никуда не денется.

2 голосов
/ 23 июля 2011

Единственный способ, которым вы сможете должным образом продвигаться, хотя STL std::list<T> независимо от платформы и компилятора, - это использование std::list<T>::iterator или std::list<T>::const_iterator, так что это действительно единственный вариант, есливы планируете реализовать свой собственный связанный список.В соответствии со стандартом, как уже сообщали другие, итератор для элемента std::list будет оставаться действительным до тех пор, пока этот элемент не будет удален из списка.

0 голосов
/ 23 июля 2011

То, о чем вы спрашиваете, называется «итератором ввода», и быстрый поиск предоставит вам качественную реализацию для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...