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



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

    #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);
}

这两个版本都让您无需考虑。例如,您不必先实例化和清空向量,然后检查函数的返回值(您很容易忽略这样做(,并且您不必记录传递非空向量会发生什么,或者如果您是函数的用户,则不必阅读文档。

最新更新