通常我在构建reserve
后立即致电std::vector
。这通常不会导致std::vector
现有的堆分配被销毁并替换为新的堆分配吗?有没有办法在构建时保留内存而不是分配堆空间然后立即销毁它?或者std::vector
中是否有实施技巧以确保这不是问题?
可用的构造函数似乎只能用于使用值填充std::vector
,而不是明确地保留空间。
答案 0 :(得分:10)
您的问题基于错误的前提,即默认构造的std::vector<T>
将执行[零长度]分配。
实际上没有理由这样做。一个新的载体应该具有容量零(虽然这是理智所要求的,而不是标准所要求的。)
因此,您的目标已经天生就满足了。
说实话,标准库并不是 愚蠢。
答案 1 :(得分:0)
如果您在编译时知道元素的数量,则可以使用以下元素列出初始化向量:
class MyClass
{
int x, y, z;
std::vector<int> v;
public:
MyClass(int X, int Y, int Z) : x(X), y(Y), z(Z), v{x, y, z}
{}
};
但这并不是很好维护。还有更多高级技术,例如可以使std::vector
使用的自定义分配器可以从预先分配的内存池中获取内存,例如:我怀疑你确实需要它。现代实施可以轻松优化这么简单的问题。
答案 2 :(得分:0)
原因可能具有讽刺意味,我们的功能签名已经用完了。
要求来自使用场景,我们确切地知道我们将保存多少元素到vector中但我们真的不喜欢n-duplicated元素构造函数:
for i, txt in enumerate(names):
if x[i] > 2 or y[i] > 2:
# annotate only if a point is having either x > 2 or y > 2.
ax.annotate(txt, (x[i], y[i]), alpha=0.6)
不幸的是,签名被上面的构造函数占用。任何其他可能的签名都可能导致问题E.g。
std::vector( size_type count, const T& value = T())
将与vector(size_type count, size_type reserve_count)
向量的上述n重复元素构造函数冲突。
T(size_type)
是一种可能的解决方案,但它太长而且仍然很无聊。我们需要在调用vector(size_type count, const T& value = T(), size_type reserve_count)
其他可行的解决方案:
提供类似make_pair / make_unique的功能。
定义从Allocator派生的Reserver,因此我们可以使用构造函数向量(const Allocator&amp; alloc),如
auto v = vector<T>(0, T(), reserve_count)
答案 3 :(得分:-1)
对象std::vector
及其元素数组不存在于同一个连续的内存块中,否则每次调整数组大小时其地址都会发生变化,从而无法保持对它的可靠引用。对象的主体仅包含控制变量和指向实际数组的指针,它将在堆栈中实例化(假设您将其用作局部变量)以及其他局部变量。此时数组将为空,可能由指向nullptr
的指针表示。因此,如果你reserve
在构造时或之后,没有重要的优化发生。
如果您希望std::vector
具有即时保留的静态大小,则可以使用常规C数组而不是std::vector
。只要确保它适合堆栈。