Как получить данные из const_iterator STL? - PullRequest
4 голосов
/ 27 февраля 2010

У меня есть что-то вроде этого:

T baseline;
list<T>::const_iterator it = mylist.begin();
while (it != mylist.end()) {
    if (it == baseline) /* <----- This is what I want to make happen */
    // do stuff
}

Моя проблема в том, что я понятия не имею, как извлечь данные из итератора. Я чувствую, что это глупая вещь, которую нужно смущать, но я не знаю, как это сделать.

РЕДАКТИРОВАТЬ: Исправлено begin.end ()

Ответы [ 6 ]

9 голосов
/ 27 февраля 2010

Итераторы имеют интерфейс, который «выглядит» как указатель (но они не обязательно являются указателями, поэтому не забирайте эту метафору слишком далеко).

Итератор представляет ссылку на один фрагмент данных в контейнере. Вам нужно получить доступ к содержимому контейнера в позиции, указанной итератором. Вы можете получить доступ к содержимому в позиции it, используя *it. Аналогично, вы можете вызывать методы для содержимого в позиции it (если содержимое является объектом), используя it->method().

Это на самом деле не относится к вашему вопросу, но это обычная ошибка, которую нужно искать (даже я все еще делаю это время от времени): если содержимое в позиции it является указатель на объект , для вызова методов объекта, синтаксис (*it)->method(), поскольку существует два уровня косвенности.

3 голосов
/ 27 февраля 2010

Синтаксис для использования итератора в основном такой же, как с указателем.Чтобы получить значение, на которое итератор «указывает», вы можете использовать разыменование с помощью *:

 if (*it == baseline) ...

Если список является списком объектов, вы также можете получить доступ к методам и свойствам объектов с помощью ->:

 if (it->someValue == baseline) ...
2 голосов
/ 27 февраля 2010

Использование:

if (*it == baseline) 
1 голос
/ 27 февраля 2010

итераторы std перегружают оператор * (), таким образом, вы можете получить доступ к указанному местоположению так же, как если бы это был указатель.

T const& a = *it;
1 голос
/ 27 февраля 2010

Используйте * для доступа к элементу, указанному итератором. Когда вы сравниваете, я думаю, вы должны использовать if (* it == baseline)

0 голосов
/ 28 февраля 2010

из того, что я знаю, итераторы std - это не указатели, а тонкая оболочка вокруг фактических указателей на базовые отдельные элементы данных.

вы можете использовать something=*it чтобы получить доступ к элементу, указанному итератором.

* it == baseline - правильный код для такого поведения.

Также, если вы имеете дело с коллекциями из STL, вы можете использовать такие функции, как find_if http://www.cplusplus.com/reference/algorithm/find_if/

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