2016-07-12 11 views
0

C++のチュートリアルの次のコードが見つかりました。あなたは*vが使用されていることがわかりますなぜこのコードにポインターを使うべきですか?

cout << "value of v = " << *v << endl; 

:で 。私たちは、の代わりにvを使用してはならない理由を教えてください。

#include "StdAfx.h" 
#include <iostream> 
#include <vector> 
using namespace std; 


int main() 
{ 
    // create a vector to store int 
    vector<int> vec; 
    int i; 


    // access 5 values from the vector 
    for(i = 0; i < 5; i++){ 
     cout << "value of vec [" << i << "] = " << vec[i] << endl; 
    } 

    // use iterator to access the values 
    vector<int>::iterator v = vec.begin(); 
    while(v != vec.end()) { 
     cout << "value of v = " << *v << endl; 
     v++; 
    } 
    cin.get(); 
    cin.get(); 
    return 0; 
} 
+1

イテレータまたはそれが指しているものを印刷しますか? – immibis

+0

単に 'v'が' iterator'であるため、逆参照して値を取得する必要があります – DimChtz

+1

私はそのサンプルが気に入らないのです。プリインクリメントまたはC++ 11範囲ベースのループを使用すると、より良い結果が得られます。 –

答えて

3

vのタイプあなたは

<< v << endl; 

を行うことをしようとした場合、あなたが望むのに対し、あなたは、出力ストリームにiteratorを書き込もうとすると思いますので

vector<int>::iterator v 

ですint。そのため、イテレータを間接参照するには、基礎となるオブジェクトで取得する*演算子を使用して、イテレータ内に含まれる

<< *v << endl 
+0

ありがとう、ベクトルについてもう少し説明できます :: iterator v? – sasan

+0

[この投稿を読む](https://stackoverflow.com/questions/5606973/understanding-iterators-in-the-stl)が役立つかどうかをご覧ください。 – CoryKramer

1

vector<int>::iteratorintへのポインタで、本質的にです。

より一般的には、イテレータタイプは、逆参照演算子をオーバーロードし、イテレータが現在参照している要素を返します。

そのため、値を抽象化する場合は、<< *vと記述する必要があります。 (ただし、vvec.end()にある場合は実行しないでください。逆参照時の動作は未定義です)。

+0

's/abstract/extract /'? –

関連する問題