用unique_ptr初始化std :: vector

时间:2018-07-22 02:59:13

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

我可以这样做:

#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的最短方法吗?

1 个答案:

答案 0 :(得分:2)

所有这些都等效于std::vector<int> v(size); -创建特定大小的向量并默认初始化所有成员。您对数组和unique_ptrs所做的全部工作就是使用默认的初始化成员创建一个数组,然后将其复制到向量中-默认情况下,直接初始化数组更简单。

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

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