Сравните текущий и следующий элемент набора - PullRequest
0 голосов
/ 08 января 2012

Я хочу сравнить текущий и следующий элемент набора адресов. Я попробовал следующий код

    struct Address{
          string state;
          string city;
    }

    if((*it).state == (*(it+1)).state){
    } 

Но компилятор выдал ошибку, что нет совпадения для оператора + в "it + 1". На cplusplus.com я обнаружил, что оператор + не поддерживается для заданных контейнеров. Поэтому я не могу найти способ получить доступ как к текущему, так и к следующему элементу набора в одном и том же операторе if.

Ответы [ 3 ]

1 голос
/ 08 января 2012

Но ++ предоставляется, поэтому вы можете написать:

?::iterator next = it;
next++;
1 голос
/ 08 января 2012

Просто создайте копию итератора, продвиньте ее (++), затем сравните. Или, если она есть в вашей стандартной библиотеке, вы можете использовать функцию c ++ 11 next из библиотеки <iterator>.

if(it->state == std::next(it)->state)
0 голосов
/ 08 января 2012

Как вы уже узнали, оператор + не поддерживается для std::set итераторов, поскольку это только bidirectional iterators, а не random access iterators.Поэтому, если вы хотите получить доступ к следующему элементу одновременно с текущим, вам нужно сделать копию и увеличить ее:

std::set<Address>::iterator next_it = it;
++next_it;
if(it->state == (next_it)->state)

Если вы используете c ++ 11, этот код можно просто скопироватьиспользуя функцию std::next, найденную в <iterator> (которая в основном делает то же самое):

if(it->state == std::next(it)->state)

Конечно, написание этой функции довольно тривиально, поэтому вы всегда можете написать свой собственный next при кодированииpre C ++ 11.

Также: не забудьте убедиться, что следующий итератор не равен set.end()

...