【发布时间】:2015-02-03 23:17:05
【问题描述】:
我需要存储ThirdPartyElm 类型的元素序列,并且我正在使用std::vector(如果我需要固定大小的序列,则使用std::array)。
我想知道我应该如何初始化序列。第一个版本创建一个新元素,并且(如果我是对的)在将元素插入序列时创建一个副本:
for (int i = 0; i < N; i++)
{
auto elm = ThirdPartyElm();
// init elm..
my_vector.push_back(elm); // my_array[i] = elm;
}
第二个版本存储一个指针序列(或者更好的c++11智能指针):
for (int i = 0; i < N; i++)
{
std::unique_ptr<ThirdPartyElm> elm(new ThirdPartyElm());
// init elm..
my_vector.push_back(std::move(elm)); // my_array[i] = std::move(elm);
}
哪个版本最轻量级?
请突出显示所有错误。
【问题讨论】:
-
你能定义“轻量级”吗?第二个版本有这样的优势,如果你愿意为 ThirdPartyElm 定义一个删除函数对象
ThirdPartyElmDeleter,那么你可以通过std::vector<std::unique_ptr<ThirdPartyElm,ThirdPartyElmDeleter> >来实现 pimpl idiom。 -
不要把新的智能指针看成指针,尤其是在“轻量级”方面(智能指针方式实际上使用更多内存,因为你需要空间对于实际的智能指针对象及其指针),大多数时候您应该从所有权的角度查看
std::unique_ptr和std::shared_ptr。
标签: c++ pointers c++11 vector initialization