сравнивая итераторы в C ++ - PullRequest
1 голос
/ 06 июня 2011

Я запутался в сравнении итераторов в C ++. Со следующим кодом:

std::iterator< std::forward_iterator_tag, CP_FileSystemSpec> Iter1;
std::iterator< std::forward_iterator_tag, CP_FileSystemSpec> Iter2;

while( ++Iter1 != Iter2 )
{

}

Ошибка:

error: no match for 'operator++' in '++Iter1'

Кажется, я помню, что вы не могли сделать то, что делает код выше. Но я не совсем знаю, как сделать сравнение.

Ответы [ 4 ]

6 голосов
/ 06 июня 2011

std::iterator не является итератором сам по себе, но базовый класс, от которого другие итераторы могут наследовать, чтобы получить несколько стандартных typedefs.

template<class Category, class T, class Distance = ptrdiff_t, class Pointer = T*, class Reference = T&> 
struct iterator 
{ 
    typedef T value_type; 
    typedef Distance difference_type; 
    typedef Pointer pointer; 
    typedef Reference reference; 
    typedef Category iterator_category; 
};
2 голосов
/ 06 июня 2011

Вы должны быть производными от std::iterator - создание его непосредственно не имеет смысла.

2 голосов
/ 06 июня 2011

Эта ошибка не имеет ничего общего со сравнением - она ​​говорит о том, что этот конкретный итератор не поддерживает приращение.

0 голосов
/ 06 июня 2011

Чтобы этот пример работал, используйте итератор, который поддерживается последовательностью, например vector:

std::vector<int> foo(10); // 10 times 0

std::vector<int>::iterator it1 = foo.begin();
std::vector<int>::iterator it2 = foo.end();

while(++it1 != it2) {
    // do stuff
}

Обратите внимание, что это не канонический способ перебора коллекции. Это также сложно, потому что пропускает первый элемент последовательности. Используйте это:

for(std::vector<int>::iterator it = foo.begin(); it != foo.end(); it++) {
    // do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...