std::vector和内存分配

7
似乎每当您向std::vector添加新元素时,如果没有空元素,则分配的元素数量会加倍(至少在GCC 4.9中是这样)。我认为这样做是为了实现摊销常数时间复杂度。
例如,在运行以下代码后:
v.push_back (1);
v.push_back (2);
v.push_back (3);
v.push_back (4);
v.push_back (5);

v.shrink_to_fit(); // capacity is 5 now
v.push_back (6);

std::cout << v.capacity () << std::endl;
输出结果是10。
在内存受限的系统中,是否有任何方法可以防止这种行为发生,即使以性能惩罚为代价?
此外,是否可能指示它仅分配固定数量的元素,而不是将其加倍?
我知道我可以在添加新元素之前调用std::vector :: reserve(),但在我的情况下似乎很混乱...调用std::vector :: shrink_to_fit()是另一种方法,但也不方便。

5
为了避免(减少)混乱,你可以编写自己的免费函数,该函数接受一个向量和一个要添加的元素,然后执行 v.reserve(v.size() + 1),然后再执行 push_back - dlf
3
为什么在这种情况下(如果需要固定大小),不使用数组? - 4pie0
3
你的问题的答案非常简单。不行,不行。你已经知道了解决问题的方法,但是不愿意使用它,所以我就不打扰解释了。 - Benjamin Lindley
3
v.reserve(v.size() + 1)会使得v.capacity()至少为v.size() + 1,而不是恰好等于v.size() + 1,这正是原作者的本意,而非OP所期望的。 - Cornstalks
2
@0d0a 是的。已编辑(但我会保留我的错误评论,以避免其他评论变得无意义)。 - dlf
显示剩余8条评论
1个回答

5

没有任何方法可用。

你唯一的选择就是编写自己的向量数据结构,这样你就可以根据需要进行操作(或者你可以复制互联网/ c++库的实现,更改所需内容,并将该新向量包含在你的程序中)。

实际上,你也可以使用数组和realloc命令。


如何在使用realloc时与数组配合使用? - user2672107

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接