2013-06-03 2 views
14

У меня есть два итератора в контейнер, один const и один неконстантный. Есть ли проблема с их сопоставлением, чтобы убедиться, что оба они относятся к одному и тому же объекту в контейнере? Это общий C++ 11 итератора вопрос:const для сравнения не-const итераторов, являются ли они действительными

Может константный и Неконстантный итератор правомерно сравнить, чтобы увидеть, если они оба относятся к одному объекту, независимо от типа контейнера (то есть, они оба являются итераторами, которые гарантированно передают объектам в одном контейнере или конце контейнера(), но один из них - const, а другой нет)?

Например, рассмотрим следующий код:

some_c++11_container container; 

// Populate container 
... 

some_c++11_container::iterator iObject1=container.begin(); 
some_c++11_container::const_iterator ciObject2=container.cbegin(); 

// Some operations that move iObject1 and ciObject2 around the container 
... 

if (ciObject2==iObject1) // Is this comparison allowed by the C++11 standard? 
    ...; //Perform some action contingent on the equality of the two iterators 
+0

Уверенный в себе. Но обратите внимание, что вы сравниваете итераторы, а не значение, указанное итераторами. – dchhetri

+1

@ user814628 Доказательства, пожалуйста? – BoBTFish

+0

Я думал, это было очевидно. Если мы можем сравнивать неконстантный объект const, нет причин, по которым мы не сможем сравнивать итераторы. – dchhetri

ответ

12

Да, это будет работать так, как вы ожидаете.

Стандарт гарантирует, что для любого типа контейнера some_container::iterator может быть неявно преобразован в some_container::const_iterator.

В первой таблице в 23.2.1 [container.requirements.general], после определения X как тип контейнера, который содержит объекты типа T, имеет:

Выражение: тип X::iterator

Возврат : тип итератора, тип значения которого равен T

Примечание: любая категория итераторов, соответствующая требованиям переднего итератора. конвертируется в X::const_iterator.


Expression: X::const_iterator

Возвращаемого типа: постоянный тип итератора, значение которого тип T

Примечание: любая категория итератора, который отвечает требования форвардных итераторов.

(Это на самом деле не выражение, и типы, а не имеющий «возвращаемые типов», но это, как они сжаты в таблицу, которая является в основном выражением.)

Так что, когда у вас есть ciObject2==iObject1, компилятор замечает, что лучшим operator== является ciObject2==some_container::const_iterator(iObject1). И operator== на двух const_iterator говорит вам, относятся ли они к одному и тому же элементу.

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

+1

Если вы можете процитировать главу и стих, я рассмотрю вопрос и дам вам галочку. –

+3

Обратите внимание, что это не требование к контейнерам, а спецификация интерфейса для контейнеров, определенных в стандарте. Таким образом, это не относится к ** всем ** итераторам, только к итераторам, которые поступают из стандартных контейнеров. Для других источников итераторов (контейнеров или других) проверьте документацию. –

1

Я не думаю, что это возможно там будет вопрос, сравнивая их. Если у вас есть константный итератор, когда вы проверяете, что он является конечным, итератор end() возвращает не const.

+0

Я заметил, что возврат 'end()' является возвратным типом возврата, будет автосохранение const – aaronman

+0

. Функции 'Container :: end()' имеют 2 перегрузки, один возвращает итератор 'const', а другой - -'const'. – Praetorian

+3

Я всегда думал, что cbegin() и cend() были добавлены, чтобы помочь с автоматическим вычитанием типа. Например: 'auto ciObject = myContainer.cbegin(); // ciObject является константным итератором для объекта. –

1

iterator IIRC неявно преобразуется в const_iterator. И результат должен указывать на ту же позицию.

Если так, смешанное сравнение выполнит преобразование, сравните совместимые совместимые константы.

1

От §24.2.3/1

Класс или указатель типа X удовлетворяет требованиям входного итератора для типа значения, если TX удовлетворяет Iterator (24.2.2) и (EqualityComparableТаблица 17) требования ...

Таким образом, входные итераторы должны быть EqualityComparable.

Все стандартные итераторы контейнеров библиотеки должны удовлетворять требованиям итератора в прямом направлении (§23.2.1 - Таблица 96). Поскольку эти требования являются надмножеством требований к входному итератору, следует, что эти итераторы должны удовлетворять концепции EqualityComparable.

Кроме того, из §23.2.1 - Таблица 96, X::iterator требуется, чтобы быть конвертированы в X::const_iterator.

Добавление двух вместе отвечает на ваш вопрос о том, что по стандарту действительно требуется, чтобы сравнение Container::const_iterator с Container::iterator было четко определено (если оба являются действительными итераторами, указывающими на один и тот же контейнер).

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