Сравнивать итераторы в C++

можно ли сравнить два итератора? Сравнение с использованием std:: min

void change ( typename TList <Item *>::Type ::iterator it_begin, typename TList <Item*>::Type ::iterator it_end )
{
   ....
this->items.resize ( index );
   std::sort ( it_begin, std::min (it_end, it_begin += index - 1); //Compare two iterators, exception
....
}

выбрасывает следующее исключение:

Assertion failed: Vector iterators  incompatible... 

есть ли другой способ сравнения?

4 ответов


да. Но я сомневаюсь, что вы сможете сделать это с std::min.

можно использовать std::distance функция для вычисления расстояния между двумя итераторами. И затем вы можете использовать расстояние, чтобы определить, какой итератор поменьше. Как только вы узнаете меньший итератор, вы можете передать это в


чтобы ответить на вопрос, std::distance() можно использовать для измерения расстояния до итератора begin (), а затем эти расстояния можно сравнить. Однако, как отметил Бен, есть и другие проблемы с вашим кодом. См.http://www.cplusplus.com/reference/std/iterator/distance/


после вызова resize, все существующие итераторы становятся недействительными.

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


в книге C++ Primer 5th Ed. на р. 111 раздел 3.4.2 арифметика итератора говорит:

мы можем использовать == и != для сравнения с допустимыми итераторами в любом из контейнеров библиотеки.

в разделе также говорится, что итераторы для строк и векторов поддерживают реляционные операторы (он же арифметика итератора), которые включают >, >=,