2016-05-04 11 views
0

Ich versuche, zwei Elemente in einer Liste zu vergleichen, indem Sie in das nächste Element in der Liste "spähen". Verwenden von C++ 11.C++ Iterator Zugriff nächstes Element zum Vergleich

Ist das möglich? Ich habe Probleme.

#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

Sie dereferencing 'Es' und dann Zugabe von 1 zu. Versuchen Sie '* std :: next (it)'. – DeiDei

+0

Oder nur '* (it + 1)' was ist nicht das gleiche wie '* it + 1' was bedeutet' (* it) + 1' – immibis

+1

@immibis Würde nicht mit 'std :: list' arbeiten. Es ist ein 'ForwardIterator'. – DeiDei

Antwort

3

Ja, es ist möglich:

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

Danke John - Was bedeutet UB? –

+0

@Chen: Undefiniertes Verhalten. Zeug, das du nicht tun darfst. –

0

Es ist möglich, aber Ihre *it mit *it ergänzt um 1 gegen (dh auch anders).

Ich nehme Ihre Absicht, zwei benachbartes Module Element der Liste, so [dank Deidei für die Korrektur]

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

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

ps zu konfrontieren war: sorry für mein schlechtes Englisch

+0

'* (it-1)' wird nicht mit einem 'std :: list' kompilieren. – DeiDei

+0

@DeiDei: D'oh! Du hast recht: Es ist eine Liste. Vielen Dank; Ich werde korrigieren. – max66

1

Ihre Suche kann durch die Verwendung std::adjacent_find() stattdessen vereinfacht werden (die unterstützt std::list Iteratoren):

Durchsucht den Bereich [first, last) nach zwei aufeinanderfolgenden identischen Elementen.

Zum Beispiel:

list<int>::iterator it = std::adjacent_find(intList.begin(), intList.end()); 
if (it != intList.end()) 
    cout << "Duplicate: " << *it << '\n';`