2016-05-04 18 views
0

リスト内の2つの要素を、リスト内の次の要素に「調べる」ことで比較しようとしています。 C++を使用する11。C++反復子の次の比較要素へのアクセス

これは可能ですか?私はいくつかの問題を抱えています。

#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

。 '* 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

それは可能ですが、あなたは(それも違う)1により増強*it*itが直面しています。

私は、あなたの意図は、リストの2つの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'; 
    } 
} 

PSを考える:私の悪い英語のため申し訳ありません

+0

'*(it-1)'は 'std :: list'でコンパイルされません。 – DeiDei

+0

@DeiDei:D'oh!そうです、それはリストです。ありがとう。私は訂正します。 – max66

1

の検索は、(std::listイテレータをサポートしている)の代わりにstd::adjacent_find()を使用することによって単純化することができます。

[first, last)を2つの連続した同一要素で検索します。例えば

:あなたは `it`を逆参照し、それに1を追加している

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