ベクトルを使用しているときに、なぜ宿題[mid]のように演算子[]を使うのですか?また、homework.end()は宿題ではありませんが、それはbeginのようなものです。要素に違った方法でアクセスするだけですか?このように混乱していますが、あなたは同意しませんか?ベクトル - >メンバー関数begin()とend()の使用法と演算子[]
答えて
vector :: operator []は、ベクトルのN番目の要素を取得します。このような演算子は、選択されたSTLコンテナクラスに対してのみ定義されます。
vector.end()はイテレータを返すメソッドです。反復子は、ベクトルを含むSTLコンテナで作業するための特別なエンティティです。 vector :: end()は、ベクトルの最後の要素の直後の要素を指します。コンテナ全体が通過したかどうかを判定するためにイテレータをキャンパーするための値として扱われることがよくあります。
begin()とend()は、イテレータを返すvectorのメンバ関数です。このイテレータは、値を取得するために参照解除することができます。同様に、インデックスを取り、その位置に格納されている値を直接返すoperator []があります。
それ... 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配列
使用にアップグレードする '簡単' など
使用は順次
+1、アニメーションが役立ちます。イテレータとポインタを混同するのは簡単かもしれないので、 "itはvector :: endとまったく同じです"と言いたいことがあります。 「それはvector :: endとまったく同じです」と言う方がより正確です。 –
彼らは違うことをします。 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());
開始()、終了()が有用である理由です。
- 1. 乗算演算子をメンバー関数としてオーバーロードする
- 2. std :: beginとstd :: endを使用したベクトルの初期化
- 3. メンバー関数vs演算子オーバーロード
- 4. メンバー関数を持つパイプライン演算子
- 5. は、BEGINとEND
- 6. 残りの演算子と関数演算子を関数定義に一緒に使用する方法は?
- 7. オーバーロード>>演算子、whileループwhileベクトル
- 8. メンバー関数テンプレートと演算子オーバーロード()C++で
- 9. F#:>演算子の使用方法
- 10. 変換演算子と演算子>>
- 11. Visual Studioのstd :: beginとend :: endイテレータ
- 12. JSfiddleレッスン - 「 - =」下の関数と演算子
- 13. 三項演算子と関数のシグネチャ
- 14. 演算子とフレンド関数のオーバーロード
- 15. タイマーでJavaラムダ関数演算子( - >)を使用
- 16. このスコープとは異なるES6 =>関数演算子
- 17. STLアルゴリズムのbegin()とend()
- 18. Verilogモジュールインスタンシエーションと空のbegin end
- 19. ハッシュ関数と余り演算子
- 20. 関数演算子と環境
- 21. 算術演算子と関係演算子
- 22. PythonでAND演算子とNOT演算子を使用する
- 23. C++クラスコンストラクタとistream演算子>>
- 24. ビット演算子 ">>"と "<<"?
- 25. Java演算子 - > how ==演算子
- 26. haskellの>>演算子の逆数
- 27. ベクトル演算子[]戻り値
- 28. 演算子のオーバーロード:メンバ関数と非メンバ関数の比較?
- 29. JQuery/Javascriptと&&演算子の使用
- 30. C++演算子のオーバーロードと使用
「これはもっと混乱していますが、同意しないのですか?」はい、可能な限り混乱させました。テンプレートのコンパイルエラーを追加する以外は? –
もう一度質問がありましたか? – soulmerge
完全に非干渉性です。あなたの質問を編集して、あなたが尋ねているものについて手がかりを得ることができます。 –