bools向量未正确初始化

时间:2013-02-28 06:42:52

标签: c++

我已初始化vector bools,但出于某种原因 一切都设置为false。为什么我不能设置vector booltrue

#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;
}

3 个答案:

答案 0 :(得分:6)

d_WFlag.push_back(true); 新条目添加到向量中,它不会更改任何旧条目!也就是说,如果向量最初具有N个元素,d_WFlag.push_back(true);会使向量具有N+1个元素。

如果要修改索引i的现有元素,请执行以下操作:

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

其中i必须是有效索引,否则上述代码将调用未定义的行为。

如果您怀疑i可能是无效索引,那么您可以使用at()

d_WFlag.at(i) = true; 

std::out_of_range无效时,它会抛出i异常。

要知道[]何时优于at()at()何时优于[],请参阅:

希望有所帮助。

答案 1 :(得分:2)

但是你可以做的是从0循环到&lt; 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;进行设置。

答案 2 :(得分:1)

仅当您阅读std::vector::push_back()的文档时... 元素附加到向量的末尾。所以你要做的是“将第5个项目添加为true,然后打印第一个项目;将第6个项目添加为true,然后打印第二个项目......”etv。

要更改已存在的元素,请使用operator[]

d_WFlag[i] = true;

顺便说一句,for循环中的结束条件需要为i < dNumGrids,否则您不会设置最后一项。