-2

我已经初始化了一个vectorbools但由于某种原因,一切都设置为false。为什么我不能设置 a vectorof boolto 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()...的文档时,它才会将一个元素附加到向量的末尾。所以你要做的是“添加 true 作为第 5 项,然后打印第一项;添加 true 作为第六项,然后打印第二项......” etv.

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

d_WFlag[i] = true;

而且,顺便说一句,for循环中的结束条件必须是i < dNumGrids,否则你不设置最后一项。

于 2013-02-28T06:48:42.437 回答