我需要初始化向量并检查初始化是否成功多次,所以我决定为此创建一个函数。问题是我无法找到一种方法来解决这个问题,而不会损失大量的效率。到目前为止,这是我的尝试:
#include <iostream>
#include <vector>
bool init(std::vector<double>& v, int n, double x) {
try {
v = std::vector<double>(n, x);
}
catch (std::bad_alloc& e) {
std::cerr << "Error: " << e.what() << std::endl;
return false;
}
return true;
}
int main() {
int n = -1;
std::vector<double> v;
if (not init(v, n, 1)) {
std::cerr << "Vector failed to initialize" << std::endl;
}
else {
for (int i = 0; i < n; ++i) {
std::cout << v[i] << std::endl;
}
}
}
请注意,我创建了一个新向量,然后调用复制构造函数,因此开销类似于初始化两个向量而不是一个向量。有没有有效的替代方案?
请注意,我创建了一个新向量,然后调用复制构造函数,因此开销类似于初始化两个向量而不是一个向量。
我不这么认为。
你创建一个空std::vector<double> v
,这是一个相对便宜的操作,然后在init()
中给它分配一个新值。
但是,在init()
中,临时std::vector<double>(n, x)
被分配给v
,因此将调用移动赋值运算符,而不是复制构造函数,并且不执行不必要的复制。
某些内容后,无法对其进行初始化。但是,解决"问题"的最简单"解决方案"是就地构造向量,而不是使用带有"输出参数"的"init"函数。
int main() {
int n = -1;
try
{
std::vector<double> v(n, 1);
for (int i = 0; i < n; ++i) {
std::cout << v[i] << std::endl;
}
}
catch(const std::bad_alloc&)
{
std::cerr << "Vector failed to initialize" << std::endl;
}
}
如果你真的需要一个"init"函数作为你的向量,那么按值返回并使用它来初始化调用方端的东西。
std::vector<double> init(int n, double x) {
return std::vector<double>(n, x);
}
这两个版本都让您无需考虑。例如,您不必先实例化和清空向量,然后检查函数的返回值(您很容易忽略这样做(,并且您不必记录传递非空向量会发生什么,或者如果您是函数的用户,则不必阅读文档。