Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::另一个函数中的向量初始化_C++_Vector_Initialization_Try Catch - Fatal编程技术网

C++ std::另一个函数中的向量初始化

C++ std::另一个函数中的向量初始化,c++,vector,initialization,try-catch,C++,Vector,Initialization,Try Catch,我需要初始化向量并检查初始化是否多次成功,因此我决定为此创建一个函数。问题是,我无法找到一种在不损失大量效率的情况下解决这个问题的方法。到目前为止,这是我的尝试: #include <iostream> #include <vector> bool init(std::vector<double>& v, int n, double x) { try { v = std::vector&

我需要初始化向量并检查初始化是否多次成功,因此我决定为此创建一个函数。问题是,我无法找到一种在不损失大量效率的情况下解决这个问题的方法。到目前为止,这是我的尝试:

    #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;
            }
        }
    }
#包括
#包括
bool init(std::vector&v,int n,double x){
试一试{
v=标准::向量(n,x);
}
捕获(标准::错误分配和e){
标准:cerr
请注意,我创建了一个新的向量,然后调用复制构造函数,因此成本类似于初始化两个向量而不是一个

我不这么认为

创建一个空的
std::vector v
,这是一个相对便宜的操作,然后在
init()
中为其分配一个新值

但是,在
init()
中,将临时
std::vector(n,x)
分配给
v
,因此将调用移动分配运算符,而不是复制构造函数,并且不会执行不必要的复制

请注意,我创建了一个新的向量,然后调用复制构造函数,因此成本类似于初始化两个向量而不是一个

我不这么认为

创建一个空的
std::vector v
,这是一个相对便宜的操作,然后在
init()
中为其分配一个新值

但是,在
init()
中,一个临时的
std::vector(n,x)
被分配给
v
,因此将调用移动赋值操作符,而不是复制构造函数,并且不会执行不必要的复制。

在构造完某个对象后,您无法初始化它。但是,最简单的“解决方案”是解决“问题”是就地构造向量,而不是使用带有“输出参数”的“init”函数

intmain(){
int n=-1;
尝试
{
std::向量v(n,1);
对于(int i=0;i
intmain(){
int n=-1;
尝试
{
std::向量v(n,1);
对于(int i=0;i
std::cout Using?现在每个向量“创建”都有一个
if
与try/catch相比,您并没有节省太多(如果有的话)。请注意,由于大多数操作系统都支持内存过度使用,因此在您的情况下,实际获得
错误的alloc
是很少的,可能不值得尝试处理。这不是初始化。好的,您是在初始化一个临时值,但核心问题是您正在分配给or原始向量,不是初始化它,当然也不是“多次”.现有的答案是好的。不过,老实说,这不是问题:实例化一个空向量基本上没有任何作用。在将您的设计与这样的假设考虑因素混淆之前,请先进行分析。使用?现在,对于每个向量“创建”,您都有一个
if
与try/catch相比,您并没有节省太多(如果有的话)。请注意,由于大多数操作系统都支持内存过度使用,因此在您的情况下,实际获得
错误的alloc
是很少的,可能不值得尝试处理。这不是初始化。好的,您是在初始化一个临时值,但核心问题是您正在分配给or原始向量,不是初始化它,当然也不是“多次”。现有的答案是好的。不过,老实说,这不是问题:实例化一个空向量基本上没有任何作用。在将您的设计凌乱于这样的假设考虑之前,请先进行分析。返回向量或将其初始化到位会更便宜。@LightnessRacesinOrbit这是真的,用词不好g:(这回答了我的问题。那么显式调用
std::move
是更好的做法吗?另外,你能提供一个关于赋值运算符的好参考吗?@只是一个新手,你不需要在这里使用
std::move
作为
std::vector(n,x)
是一个右值。这意味着显式使用
std::move
是一种不好的做法。首先,您可以看看:返回向量或将其初始化到位会更便宜。@LightnessRacesinOrbit这是真的,措辞不好:(这回答了我的问题。那么显式调用
std::move
是更好的做法吗?另外,你能提供一个关于赋值运算符的好参考吗?@只是一个新手,你不需要在这里使用
std::move
作为
std::vector(n,x)
是一个右值。这意味着显式使用
std::move
是一种不好的做法。首先,您可以看一下:强调围绕“问题”的恐吓引语虽然-坦白说,原始代码是,fine@LightnessRacesinOrbit是的,我想我是想回答一个不同的问题,但做得不好。这与其说是回答,不如说是一个长篇大论。我想这只是回答问题的这一方面;)@junachopanza创建init函数的全部目的是避免每次我创建一个新的向量时都必须编写一个try-catch。在你的第二段代码中,你在哪里检查是否发生了异常?@Just_a_newbie异常的全部目的是你不必为每一段可以抛出的代码编写try-catch,b但是,您需要决定在哪个级别处理异常。这取决于您确定代码的哪一部分可以从异常中恢复并继续。对于向量的每个实例化,这将不同。重点放在围绕“问题”的恐吓引号上虽然-坦白说,原始代码是,fine@LightnessRacesinOrbit是的,我想我是想回答一个不同的问题,但做得不好。这与其说是一个答案,不如说是一个长篇大论。我想这只是一个问题
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;
    }
}
std::vector<double> init(int n, double x) {
  return std::vector<double>(n, x);
}