2009-07-20 15 views
-1

ベクトルを使用しているときに、なぜ宿題[mid]のように演算子[]を使うのですか?また、homework.end()は宿題ではありませんが、それはbeginのようなものです。要素に違った方法でアクセスするだけですか?このように混乱していますが、あなたは同意しませんか?ベクトル - >メンバー関数begin()とend()の使用法と演算子[]

+2

「これはもっと混乱していますが、同意しないのですか?」はい、可能な限り混乱させました。テンプレートのコンパイルエラーを追加する以外は? –

+1

もう一度質問がありましたか? – soulmerge

+2

完全に非干渉性です。あなたの質問を編集して、あなたが尋ねているものについて手がかりを得ることができます。 –

答えて

2

vector :: operator []は、ベクトルのN番目の要素を取得します。このような演算子は、選択されたSTLコンテナクラスに対してのみ定義されます。

vector.end()はイテレータを返すメソッドです。反復子は、ベクトルを含むSTLコンテナで作業するための特別なエンティティです。 vector :: end()は、ベクトルの最後の要素の直後の要素を指します。コンテナ全体が通過したかどうかを判定するためにイテレータをキャンパーするための値として扱われることがよくあります。

1

begin()とend()は、イテレータを返すvectorのメンバ関数です。このイテレータは、値を取得するために参照解除することができます。同様に、インデックスを取り、その位置に格納されている値を直接返すoperator []があります。

2

それ... C配列を有するようlength_a]

"開始/終了" バージョンINT

同じ類推だ: "エンド" は一つの要素を指し方法

int* begin = a; 
int* end = a+length_a; 
while (p<e) { 
    printf("%d", *p); 
    ++p; 
} 

注アレイを超えて!これはvector :: endとまったく同じです(停止条件として考えてください)。

"[]" バージョン:

for (int i=0; i<length_a; ++i) { 
    printf("%d", a[i]); 
} 

'[]' 要約:Cアレイ、効率的な構文非ランダムに利用可能

  • -notと互換性

    • +アクセスコンテナ(例:「リスト」への変更は困難です)

    私のPOVのアドバイス:全体のコンテンツを横断するとき[]ランダムアクセスのためまたはC配列

  • 使用にアップグレードする '簡単' など

    • 使用は順次

  • +0

    +1、アニメーションが役立ちます。イテレータとポインタを混同するのは簡単かもしれないので、 "itはvector :: endとまったく同じです"と言いたいことがあります。 「それはvector :: endとまったく同じです」と言う方がより正確です。 –

    0
    /終了を開始

    彼らは違うことをします。 operator[n]は、n番目の要素への参照を参照を返します。 begin()とend()は、コンテナの先頭と最後を指すイテレータを返します。コンテナを反復処理する必要がある場合は、イテレータを使用することはほとんど「もっと混乱しない」ことです。はるかに簡単です。

    はあなたがベクトルvを持っているとしましょう:

    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(7); 
    v.push_back(42); 
    v.push_back(3); 
    

    あなたは、単に要素を参照したい場合は、これらのオプションがありますので、ここで

    v[2]; 
    *v.begin()+2; 
    

    を、operator[]が簡単です。 しかし、あなたは、コンテナを反復処理するために、おそらく内容を印刷したい場合は、あなたが持っているこれらのオプションは:

    for (int i = 0; i < v.size(); ++i){ 
        std::cout << v[i]; 
    } 
    
    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout)); 
    

    突然、イテレータは私たちに多くの作業を保存しました。もはやループを作る必要はありません。

    それともあなたが最大の要素を見つけるしたいとしましょう:

    int max = 0; 
    for (int i = 0; i < v.size(); ++i){ 
        if (v[i] > max) { max = v[i]; } 
    } 
    
    std::max_element(v.begin(), v.end()); 
    

    または多分あなたはベクトルをソートしたいの。私もoperator[]を使用して独自のソートアルゴリズムを書き出す気にしないだろうが、ここでイテレータバージョンです:

    std::sort(v.begin(), v.end()); 
    

    開始()、終了()が有用である理由です。

    関連する問題