2016-05-04 4 views
0

Я пытаюсь сравнить два элемента в списке путем «peeking» в следующий элемент в списке. Использование C++ 11.C++ Iterator доступ к следующему элементу для сравнения

Возможно ли это? У меня проблемы.

#include <list> 
#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 

    list<int> intList; 

    intList.push_back(10); 
    intList.push_back(20); 
    intList.push_back(30); 
    intList.push_back(30); 


    list<int>::iterator it; 

    for (it = intList.begin(); it != intList.end(); it++) 
    { 
     if (*it == *it + 1) 
      cout << "Duplicate: " << *it << '\n'; 
    } 
} 
+1

Вы разыменования ', а затем Оно деталь A.' добавляя к нему 1. Попробуйте '* std :: next (it)'. – DeiDei

+0

Или просто '* (it + 1)', который не совпадает с '* it + 1', что означает' (* it) + 1' – immibis

+1

@immibis Не работал бы с 'std :: list'. Это 'ForwardIterator'. – DeiDei

ответ

3

Да, это возможно:

assert(!intList.empty()); // else ++begin is UB 

for (list<int>::iterator it1 = intList.begin(), it2 = ++intList.begin(); 
    it2 != intList.end(); ++it1, ++it2) 
{ 
    if (*it1 == *it2) 
     cout << "Duplicate: " << *it1 << '\n'; 
} 
+0

Спасибо, Джон. Что означает UB? –

+0

@Chen: Неопределенное поведение. Вещи, которые вы не должны делать. –

0

Это возможно, но ваш противостоять *it*it с дополненным 1 (то есть даже разные).

Я полагаю, ваше намерение было противостоять два adiacent элемента списка, так что [благодаря DeiDei для коррекции]

if (false == intList.empty()) 
{ 
    auto it { intList.cbegin() }; 
    auto oldVal { *it }; 

    for (; ++it != intList.cend() ; oldVal = *it) 
    { 
     if (*it == oldVal) 
     cout << "Duplicate: " << oldVal << '\n'; 
    } 
} 

пс: простите за мой плохой английский

+0

'* (it-1)' не будет компилироваться с 'std :: list'. – DeiDei

+0

@DeiDei: D'oh! Вы правы: это список. Благодаря; Я исправлю. – max66

1

Ваш поиск может быть упрощен с помощью std::adjacent_find() вместо (который поддерживает std::list итераторы):

Ищет диапазон [first, last) для двух последовательных одинаковых элементов.

Например:

list<int>::iterator it = std::adjacent_find(intList.begin(), intList.end()); 
if (it != intList.end()) 
    cout << "Duplicate: " << *it << '\n';` 
Смежные вопросы