我想将所有值放入
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
}
}
在 first 情况下,您调用
push_back
会自动增加向量的大小。
在第二情况下,您尝试访问
vect[i]
,但它不存在,因为向量的大小为0。
这里填充向量的最简单方法是
vect = std::vector<bool>(n, true);
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
的向量。
查看直播。
如果您想重新初始化
std::vector
,请选择以下选项:
std::fill
std::fill(v.begin(), v.end(), true);
std::vector::resize
v.resize(10, true);
如果 std::vector
已经初始化std::vector::assign
v.assign(10, true);
您可以使用 std::fill 来执行此操作。这是比重新分配更惯用的 C++
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<bool> v(8);
std::fill(v.begin(), v.end(), true);
}
第二个函数实现的问题是,如果向量为空或者元素少于第二个参数的值,那么您可能无法使用下标运算符。否则你会有未定义的行为。
实现之间也存在逻辑差异。
在第一个函数实现中,新元素被附加到向量中已经存在的元素中。在第二个函数实现中,现有元素被覆盖。
但是无论如何这两个函数的实现看起来都不太好。您可以使用 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
如果在某个类中初始化了向量,则可以使用 std::vector.resize() 方法
void first(std::vector<bool>& vect, unsigned int n)
{
std::vect.resize(n, true);
}