我已初始化vector
bools
,但出于某种原因
一切都设置为false
。为什么我不能设置vector
bool
到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;
}
答案 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
,否则您不会设置最后一项。