1. ホーム
  2. c++

[解決済み] std::vector に対する反復処理: 符号なしインデックス変数と符号ありインデックス変数の比較

2022-03-21 16:57:04

質問

C++でベクトルを反復処理する正しい方法は何ですか?

これらの2つのコードフラグメントを考えてみてください、こちらは問題なく動作します。

for (unsigned i=0; i < polygon.size(); i++) {
    sum += polygon[i];
}

とこれです。

for (int i=0; i < polygon.size(); i++) {
    sum += polygon[i];
}

を生成します。 warning: comparison between signed and unsigned integer expressions .

C++の世界は初めてなので unsigned 変数はちょっと怖く見えるし unsigned 変数を正しく使用しないと危険です。

どのように解決するのですか?

逆方向の反復処理については この回答 .

順方向へのイテレーションもほとんど同じです。イテレータを変えるだけ/decrementとincentを入れ替えるだけです。イテレータの方がいい。ある人は std::size_t をインデックス変数の型として使用します。しかし、それは移植性がありません。常に size_type コンテナの typedef (順方向反復の場合は変換だけで済むかもしれませんが,逆方向反復の場合に std::size_t の場合 std::size_t の型定義よりも広い。 size_type ):


std::vectorを使用する

イテレータの使用

for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
    /* std::cout << *it; ... */
}

重要なことは、定義がわからないイテレータには必ずプレフィックスインクリメント形式を使うことです。そうすることで、あなたのコードは可能な限り汎用的に実行できるようになります。

レンジC++11の使用

for(auto const& value: a) {
     /* std::cout << value; ... */

インデックスの使用

for(std::vector<int>::size_type i = 0; i != v.size(); i++) {
    /* std::cout << v[i]; ... */
}


配列の使用

イテレータを使用する

for(element_type* it = a; it != (a + (sizeof a / sizeof *a)); it++) {
    /* std::cout << *it; ... */
}

レンジC++11の使用

for(auto const& value: a) {
     /* std::cout << value; ... */

インデックスの使用

for(std::size_t i = 0; i != (sizeof a / sizeof *a); i++) {
    /* std::cout << a[i]; ... */
}

がどのような問題なのか、後方で反復して答えを読み取る。 sizeof のアプローチは、降伏する可能性がありますが。