2014-09-01 4 views
0

при создании итератора вектора, сам итератор является указателем на значения, удерживаемые вектором. поэтому * итератор фактически является значением, удерживаемым вектором., реализующий итератор определенного класса

поэтому у меня есть два вопроса:

  1. при использовании итератора на карте, что это итератор на самом деле? Я имею в виду, какова внутренняя реализация? это как структура, которая содержит разные элементы данных?

  2. Если я хочу реализовать свой собственный итератор, содержащий несколько элементов данных, что я действительно возвращаю при создании итератора?

+0

Я не понимаю ваш второй вопрос. Вы можете перефразировать его? Обычно вы должны задать один вопрос на вопрос. – user2079303

ответ

0
  1. Зависит от реализации. Обычно std::map реализован как сбалансированное двоичное дерево поиска. В этом случае итератор, скорее всего, укажет на узел в дереве.
0
  1. Итератор из std::map является структурой, которая ссылается на ключевые ценностные пары, сохраненные в вашей карте. Стандартный итератор, который вы получаете с i.e begin() или end(), является двунаправленным итератором. Это означает, что вы можете позвонить ++i и --i операторам объекта-итератора для перемещения/возврата между элементами, сохраненными на вашей карте.
  2. Почему вы хотите реализовать свой собственный итератор? Возможно, создание class или struct, сохраняя его на std::vector<T>, сделает то, что вы хотите ?! вы можете получить доступ к итератору на std::vector<T>::iterator. Если вы действительно хотите реализовать свой собственный итератор, вы должны задать себе вопрос, должен ли он работать для ваших собственных структур данных в качестве теста или если вы хотите быть совместимым с i.e std data structures. Если его последний, вы должны получить из реализации итератора и изменить его как способ ваших потребностей. Посмотрите на this ответ.
0

Итератор сам по себе является указателем на значения, удерживаемые вектором.

Vector итератор не является указатель на значение, но класс с operator * реализован, который возвращает значения, содержащиеся в контейнере, и указали, ваш итератор. В случае карты вы можете получить доступ ключ и значение с помощью first и second поля:

map<string, int> wheelMap; 
wheelMap["Car"] = 4; 

map<string, int>::iterator itWheel = wheelMap.begin(); 
cout << itWheel ->first << ":" << itWheel ->second << endl; //This will print: Car:4 

Mapiterator есть и другие операторы реализованы: +, ++, -, --, ->, ==, !=. Дополнительно vector имеет также введенный operator [] для получения значений по индексу.

+1

Это действительно зависит от типа реализации и итератора, если векторные итераторы являются просто указателем на элемент или класс. – JarkkoL

0

Я реализовал std::map -like контейнер в виде красно-черного дерева (как часто расположены используется для std::map реализации) и единственное, что потребности реализации итератора (как сопзЬ и неконстантные версии) является указателем на узел дерева. Каждый узел дерева содержит указатели на двух дочерних и родительских (плюс бит цвета), которых достаточно, чтобы пересечь дерево в любом направлении. В общем, это зависит от типов итераторов контейнера &, хотя какие данные необходимы для реализации его функций. Например.мои итераторы deque имеют указатель на контейнер и индекс элемента, но на самом деле это конкретная реализация, как реализованы итераторы и какие данные им нужны.

Смежные вопросы