2017-04-26 9 views
3

私はstd::list<std::string>のイテレータを持っていますが、+=を使用して前進しようとすると、コンパイルエラーが発生します。リストイテレータで+ =演算子を使用できないのはなぜですか?

コードは次のとおりです。

#include <list> 
#include <iostream> 
#include <string> 
int main() { 
    std::list<std::string> x; 

    x.push_front("British"); 
    x.push_back("character"); 
    x.push_front("Coding is unco"); 
    x.push_back("Society"); 
    x.push_back("City Hole"); 
    auto iter = x.begin(); 
    iter += 3; 
    //std::advance(iter, 3); 
    x.erase(iter); 

    for (auto &e: x) { 
     std::cout << e << "\n"; 
    } 
} 

私はこのclang++ -std=c++11 -o li li.cppを使用してコンパイルする場合は、私が取得:

li.cpp:13:10: error: no viable overloaded '+=' 
    iter += 3; 
    ~~~~^~ 
1 error generated. 

は、なぜ私はこのイテレータと+=使用することはできませんか?

+0

@EdChumより正確には、そのようなリストイテレータをインクリメントすることはできません。 (+ Opは進歩を知っています、そのコメントにあります) – Borgleader

+0

'iter + = 3'はあなたができない' iter = iter + 3'を意味します。 – Mudi

+0

エラーメッセージが明らかであれば、私は本当に質問が理解できません。 – user463035818

答えて

15

std::listのイテレータはBidirectionalIteratorであり、operator+=のようにRandomAccessIteratorをサポートしていません。

あなたは

++iter; 
++iter; 
++iter; 

のように(BidirectionalIterator含む)InputIteratorによってサポートされているoperator++、何かを使用することができますしかし、それは醜いです。最も良い方法は、InputIteratorBidirectionalIteratorを含む)で使用できるstd::advance(またはstd::next(C++ 11以降))を使用し、RandomAccessIteratorでサポートされている機能を利用することです。

(強調鉱山)

複雑

リニア。

InputItがさらに RandomAccessIteratorの要件を満たしている場合は、複雑さが一定です。

イテレータのカテゴリを考慮せずに使用できるので、std::advanceが最適です。例えば

std::advance(iter, 3); 

又は

iter = std::next(iter, 3); 
+3

OPはすでにコード内でこれをコメントアウトしていますので、 'advance'の使用はすでに分かっていますので、このビットを含める必要はありません。 – EdChum

+5

@EdChum質問の次のビューアにとって役立つかもしれません。 – Beginner

+0

@EdChum 'std :: advance'についていくつかの説明を追加しました。質問から(iteratorカテゴリについて)私はOPがそれを十分に理解していないかもしれないと思う。 – songyuanyao

3

std::list::iteratorRandom Access Iteratorありません。リスト内のいくつかの要素を「飛び越える」ことはできません。希望の要素に達するまでリストを反復処理する必要があります。 std::advanceを使用すると、イテレータカテゴリに基づいてイテレータを進める最良の方法を推測できます。 std::list::iteratorの場合、ループ内でイテレータをインクリメントします。

5

なぜなら、使用している双方向イテレータに対して+=演算子が定義されていないからです。すべてのイテレータについては

少なくともあります:

  • コピーアサインや破壊、すなわちX b(a);b = a;
  • をインクリメントすることができます、すなわち、++aa++

他のすべてのテーブルhereをチェックイテレータの種類によって異なります。

enter image description here

あなたはランダムアクセスイテレータは、トリックを行うだろう見ての通り。

関連する問題