【问题标题】:Initializing std::vector with unique_ptr用 unique_ptr 初始化 std::vector
【发布时间】:2018-07-22 02:59:13
【问题描述】:

我可以这样做:

#include <vector>
#include <memory>
int main(int argc, char const *argv[]) {
    int size = 5;
    int *array = new int[size];
    load(array);
    std::vector<int> v(array, array+size);
    delete[] array;
}

而且,使用智能搬运工,这个 (alt1):

#include <vector>
#include <memory>
int main(int argc, char const *argv[]) {
    std::unique_ptr<int[]> array(new int[size]);
    load(array.get());
    std::vector<int> v(array.get(), array.get()+size);
}

我想知道,有了所有这些聪明的地方,如果更短的东西(alt2)也可以:

#include <vector>
#include <memory>
int main(int argc, char const *argv[]) {
    std::unique_ptr<int[]> array(new int[size]);
    load(array.get());
    std::vector<int> v(array);
}

但是编译器说不:

c++ -std=gnu++14 -g -Wall -O3  -c -o main.o main.cpp
main.cpp:6:19: error: no matching constructor for initialization of 'std::vector<int>'
        std::vector<int> v(array);

那么,alt1 是用 unique_ptr 初始化 std::vector 的最短方法吗?

【问题讨论】:

  • 您没有使用unique_ptr 进行初始化。您只是将数组的内容复制到向量中。该数组占用的内存由unique_ptr 的实例管理这一事实无关紧要。
  • std::unique_ptr 是一个包装器,它会在引用的内存超出范围时自动处理它,这样您就不必在函数结束时自己调用delete。由于您没有使用new 运算符分配std::vector,因此您根本不需要它。另外,正如其他人所指出的,在这里创建一个数组是多余的,没有意义,std::vector 将在内部管理它自己的数组。

标签: c++ c++11 stl c++14 c++17


【解决方案1】:

所有这些都等同于std::vector&lt;int&gt; v(size);——创建一个特定大小的向量并默认初始化所有成员。您对数组和 unique_ptrs 所做的只是创建一个具有默认初始化成员的数组,然后将该数组复制到一个向量中——默认直接初始化数组更简单。

如果你想加载到向量中,你也可以这样做:

std::vector<int> v(size);
load(&v[0]);

【讨论】:

  • 不完全。原始代码对所有元素进行垃圾初始化;代码通过访问未初始化的对象表现出未定义的行为。另一方面,std::vector&lt;int&gt; v(size); 用零填充向量。
  • 稍微修改了代码。有一个函数将数据加载到数组中,我无法更改它,因此无法直接使用向量。很抱歉从一开始就没有提到这一点。
猜你喜欢
  • 2017-04-04
  • 2015-04-30
  • 2020-04-17
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2012-06-09
相关资源
最近更新 更多