2012-03-10 15 views
1

私はベクトルに列挙型を配置するプロジェクトに取り組んでいます。そのような機能をベクターからどのように得ることができるのだろうと思っていました。イテレータをベクトルに表示

これを行うには5つの方法がありましたが、いずれも機能していないようです。私はMSDNのベクトル(vector :: end()は、オペレータ<がイテレータとしてiiを受け付けないと言われるまで最も役に立つと思われました。

誰かが私を助けますか?

vector<int>::iterator ii; 
for(ii = things.begin(); ii != things.end(); ii++){      //764 
    cout << "thing(" << (int)ii << "): " << toString(things[ii]) << endl; //765 
} 

だったが、これはどちらかが意味を成していないか、私は解決する方法を見つけ出すことができないというエラーがスローされます

1>c:\...\Project.cpp(764): error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion) 
1>c:\...\Project.cpp(765): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion) 
1>c:\...\Project.cpp(765): error C2679: binary '[' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion) 
+1

どのようなタイプのあなたがそうのようなベクターにあなたの値を入力することができます

vector <int> things; 

:として – Yaniro

+0

これは 'toString(thing)'を書いたenumです(テストされています)、別のカウンタを試してみます – gardian06

+0

イテレータはインデックスではなく、もっとポインタに似ています 'thing [ii]'は完全に間違っていますので、 '* ii'を使用してください。それは、ポインタのように、エンドユーザにとって有益な情報はありません。行764はOKですが、コンパイラがなぜ不平を言っているのか分かりません。同じエラーを示す10行のプログラムを試してみてください。 –

答えて

1

things

を宣言する必要があり「物」ですか?また、ループの各ステップの値は `* ii`になります。 `ii`はベクトルの現在の位置を指します。ループカウンタを表示する必要がある場合は、そのための別の変数が必要です( `for`ループの` ii`と一緒にインクリメントできる別のint)。
+1

また、enumのような別の型を使用している場合、 'vector things;'と書かれていて、イテレータが宣言されたときには 'vector :: iterator' – gardian06

2

試してみてください。

cout << "thing(" << (ii - things.begin()) << "): " << toString(*ii) << endl; 
+0

これは多くのエラーを作成して元の実装 – gardian06

+0

OKそれはベクトルイテレータのタイプを変更した後に機能しました。最後に無視する – gardian06

2

イテレータはかなりのポインタのように振る舞う:彼らは値の位置を示し、あなたが値を取得するためにそれらを間接参照する必要があります。

std::cout << *ii; 
4

これを行うには、正しい汎用的な方法は、

for(std::vector<int>::const_iterator ii=things.begin(); 
     ii != things.end(); ++ii) 
{    
    std::cout << "thing(" 
       << std::distance(things.begin(), ii) 
       << "): " << *ii << std::endl; 
} 
です

は、イテレータを逆参照し、std :: distanceを使用して最初からの距離を取得します。

さらに一般的には、名前空間全体をインポートすることは悪いと考えられます。明示的にusingステートメントを使用するか、好ましくは接頭辞タイプを名前空間で使用する方がよいでしょう。

一般に、イテレータに接頭辞インクリメント演算子を使用する方が簡単です。

また、面白い書式設定をしていない限り、 'toString'をintに適用する必要はありません。ストリーム演算子が定義されているためです。その後

things.push_back(1); 
things.push_back(2); 

あなたはこのように繰り返す:

for (vector <int>::iterator i = things.begin(); i != things.end(); ++i) 
{ 
    cout << "things(" << (i - things.begin()) << "): " << toString(*i) << endl; 
} 
+0

私はintでtoString()をやっていません。私は列挙型でそれをやっています。 – gardian06

+0

という文に、コンパイラに依存する名前空間全体を含むことについての記述があります。コンパイラによっては、クラス/メンバは名前空間に含まれ、それらのみが含まれ、その他はすべてが含まれます。ほとんどの場合、名前空間のほとんどが軽量であることは言うまでもなく、名前空間全体を含めるのが本当に悪いのは、共有名またはメンバーの複数の名前空間を使用する場合だけです。 – gardian06

+0

標準では名前空間はコンパイラではありません。名前空間を使用することは、現在の名前空間をインポートされた名前空間とマージするのと同じです。現在の名前空間がグローバル名前空間であれば、最初にネームスペースの利点がなくなります。 – 111111

関連する問題