-2

のを初期化しましたvectorbools、何らかの理由ですべてが に設定されていfalseます。vectorboolから に設定できないのはなぜtrueですか?

#include <iostream>
#include <vector>

int main()
{
  std::vector<bool> d_WFlag;
  int d_numGrids = 4;
  d_WFlag.resize(d_numGrids);

  d_WFlag[0] = false;
  std::cout << std::noboolalpha << d_WFlag[0] << " == " << std::boolalpha << d_WFlag[0] << std::endl;
  for(int i = 1; i < (d_numGrids - 1); ++i)
  {
    d_WFlag.push_back(true);
    std::cout << std::noboolalpha << d_WFlag[i] << " == " << std::boolalpha << d_WFlag[i] << std::endl;
  }
  d_WFlag[d_numGrids - 1] = false;
  std::cout << std::noboolalpha << d_WFlag[d_numGrids - 1] << " == " << std::boolalpha << d_WFlag[d_numGrids - 1] << std::endl;

  return 0;
}
4

3 に答える 3

6

d_WFlag.push_back(true); ベクトルに新しいエントリを追加しますが、古いエントリは変更されません! つまり、ベクトルが最初にN要素を持っている場合、ベクトルが要素d_WFlag.push_back(true);を持つようになりN+1ます。

index にある既存の要素を変更する場合は、次のiようにします。

d_WFlag[i] = true; //it modifies!

whereiは有効なインデックスである必要があります。そうでない場合、上記のコードは未定義の動作を引き起こします。

i 無効なインデックスである可能性があると思われる場合は、次を使用できますat()

d_WFlag.at(i) = true; 

が無効なstd::out_of_range場合は例外をスローします。i

が より優れている場合と[]が より優れている場合を知るには、次を参照してください。at()at()[]

それが役立つことを願っています。

于 2013-02-28T06:47:22.760 に答える
2

できますが、実行しているのは 0 から < 3 (2) までのループです。

次の行d_WFlag.resize(d_numGrids)で、次のようなベクトルを作成します [0] = false, [1] = false, [2] = false, [3] = false

後で から繰り返します0 to < 3。値を使用してループに入ります。[0,1,2]これらの値はすべてfalseに初期化されています。

ループでは、ベクトルの最後に要素を追加する( push_back ) を呼び出します。最初のものはd_WFlag[4]にあり、この要素は印刷されません。

d_WFlag[i] = true;代わりにで設定してみてください。

于 2013-02-28T06:48:15.427 に答える
1

のドキュメントを読んだ場合のみstd::vector::push_back()...ベクトルの末尾に要素を追加します。したがって、「5 番目の項目として true を追加し、最初の項目を出力します。6 番目の項目として true を追加し、2 番目の項目を出力します...」などです。

既存の要素を変更するには、次を使用しますoperator[]

d_WFlag[i] = true;

ところで、forループの終了条件は である必要がありi < dNumGridsます。そうでない場合は、最後の項目を設定しません。

于 2013-02-28T06:48:42.437 に答える