Почему iterator :: end () не является статическим членом и не похож на string :: npos? - PullRequest
2 голосов
/ 09 января 2012

При выполнении итерации по std::map или std::vector или по любому контейнеру, в котором есть iterator, производится проверка по variable.end(), а не по типу container<>::end.Например,

map<int, int> var;
for(map<int, int>::iterator it = var.begin(); it != var.end(); it++)
...                                           ^^^^^^^^^^^^^^^

Не может быть выше выделенной части что-то вроде:

it != map<int,int>::end

, что похоже на статический член string::npos.В чем может быть причина принятия решения о предоставлении .end() на основе переменных, а не на основе типов контейнеров?(то есть map<int,int>::end и map<int,double>::end будут отличаться; но для каждой переменной map<int,int>, ::end будет аналогичным.)

Ответы [ 3 ]

7 голосов
/ 09 января 2012

Таким образом, некоторые контейнеры на основе массива могут реализовать итератор просто как указатель на элемент.Указатель one-past-the-last-element различен для каждого массива.

5 голосов
/ 09 января 2012

Рассмотрим следующие два массива:

int a1[] = {2, 3, 4};
int a2[] = {5, 6, 7};

Один последний последний элемент 2 массивов отличается:

int *p1 = a1 + 3; // for a1
int *p2 = a2 + 3; // for a2

Нельзя использовать один указатель для другого.Не существует универсальной константы для представления конца массива.Следующее неверно:

for (int *p = a1; p != a2; p++)

Объяснение отсутствия одинакового end() для итератора одного и того же вида контейнера аналогично.

4 голосов
/ 09 января 2012

Итераторы предназначены для итерации, перемещения вперед и назад.Они должны предоставлять операции увеличения и уменьшения (двунаправленные итераторы).Когда вы уменьшаете значение итератора end (), вы переходите к последнему элементу в контейнере.Это позволяет итерировать в обратном направлении.

Что касается вашего предложения.Реализация этого будет означать, что каждый итератор несет с собой конечный итератор и сравнивает его, равный статическому конечному итератору, когда он равен реальному конечному итератору, который он хранит.На самом деле не было бы никакого смысла делать все статические конечные итераторы разными типами, потому что этот «итератор» не может быть использован ни для чего иного, кроме этого.расточительно использовать.Если каждый итератор должен знать конец своего контейнера, то для обозначения произвольного диапазона необходимо добавить два потенциально неиспользуемых итератора к концу в миксе.

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