我想将所有值都放在std::vector
true
中。我写了两种方法:第一种有效,但第二种无效。它告诉我myproj.exe已触发断点。你知道是什么问题吗?
此作品有效:
void first(std::vector<bool>& vect, unsigned int n)
{
for (unsigned int i = 0; i < n; i++)
{
vect.push_back(true);
}
}
这不是:
void secound(std::vector<bool>& vect, unsigned int n)
{
for(unsigned int i = 0; i < n; i++)
{
vect[i] = true; //crash here
}
}
答案 0 :(得分:4)
在第一情况下,您呼叫push_back
,这会自动增加向量的大小。
在 second 情况下,您尝试访问vect[i]
,因为向量的大小为0,所以该访问不存在。
在此处填充向量的最简单方法是
vect = std::vector<bool>(n, true);
答案 1 :(得分:3)
您可以使用以下std::vector
的重载:
vector(size_type count, const T& value, const Allocator& alloc = Allocator());
其中第一个参数是std::vector
的大小,第二个参数是初始值。
完整代码:
#include <vector>
#include <iostream>
int main() {
std::vector<bool> v(10, true);
for (auto i : v) {
std::cout << std::boolalpha << i << std::endl;
}
return 0;
}
std::vector<bool> v(10, true);
将创建一个具有10个布尔值true
的向量。
签出live。
如果要重新初始化std::vector
,可以使用以下选项:
std::fill(v.begin(), v.end(), true);
那样使用std::fill
v.resize(10, true);
已经初始化,请像这样std::vector
使用std::vector::resize
v.assign(10, true);
那样使用std::vector::assign
答案 2 :(得分:1)
第二个函数实现的问题是,如果向量为空或元素少于第二个参数的值,则您可能不使用下标运算符。否则,您将具有不确定的行为。
实现之间也存在逻辑差异。
在第一个函数实现中,新元素被附加到向量的现有元素上。在第二个函数实现中,现有元素被覆盖。
但是无论如何,这两个函数的实现都不好看。您可以使用类std :: vector的一种方法执行相同的操作。
这是一个演示程序。
#include <iostream>
#include <iomanip>
#include <vector>
void reset( std::vector<bool> &v, size_t n, bool value = false )
{
v.assign( n, value );
}
int main()
{
std::vector<bool> v;
reset( v, 5);
for ( const auto item : v )
{
std::cout << std::boolalpha << item << ' ';
}
std::cout << '\n';
reset( v, 5, true );
for ( const auto item : v )
{
std::cout << std::boolalpha << item << ' ';
}
std::cout << '\n';
return 0;
}
程序输出为
false false false false false
true true true true true
答案 3 :(得分:0)
您可以使用std::fill来执行此操作。这比重新分配更惯用的c ++
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<bool> v(8);
std::fill(v.begin(), v.end(), true);
}