5

我有一个案例,我希望将资源列表存储在 std::vector 中。如我所见,我的选择如下:

  1. 给我的资源一个默认构造函数
  2. 将它们存储为堆对象(并将它们包装在共享指针中)

选项 1 可以构造无效资源,选项 2 迫使我使用堆。

我在这里错过任何选择吗?

4

3 回答 3

7

您不需要默认构造函数来拥有实例向量。

唯一的限制是当类没有默认构造函数时,您不能将 vector::resize 与默认参数一起使用。

vec.resize(20);  // requires default constructor

但你可以给 vector::resize 一个默认对象:

std::vector<foo> vec;
vec.resize(20, foo(10));  // give a sample object since foo has not default constructor
于 2010-03-05T07:31:24.863 回答
1

您可以将具有非平凡构造函数的对象存储在向量中。存储在 stl 容器中的对象应该具有赋值语义(复制构造函数和赋值运算符)。

于 2010-03-05T07:31:53.507 回答
1

第三种选择是使用Boost.PointerContainer。但是,您的对象仍将在堆上单独分配。正如 Johann 所评论的,std::vector 已经使用堆来存储对象(连续地),所以没有办法完全避免堆。

允许资源(例如互斥体、I/O 流等)具有复制语义通常没有意义。因此,必须通过将复制构造函数和赋值运算符设为私有来将它们呈现为不可复制。不幸的是,不可复制的限制使得将资源作为值直接存储在 STL 容器中是不可能的。因此,必须求助于 Boost.PointerContainer 或智能指针容器。Boost.PointerContainer 文档的动机部分解释了为什么您更喜欢使用其中一个而不是另一个。

于 2010-03-05T14:54:00.927 回答