Сравнивать итераторы в 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 арифметика итератора говорит:
мы можем использовать == и != для сравнения с допустимыми итераторами в любом из контейнеров библиотеки.
в разделе также говорится, что итераторы для строк и векторов поддерживают реляционные операторы (он же арифметика итератора), которые включают >, >=,