【发布时间】: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将在内部管理它自己的数组。