gpt4 book ai didi

c++ - 制作 std::vector capacity>=N 和 size=0 的最佳方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:25 26 4
gpt4 key购买 nike

给定一个 std::vector,其大小和容量可以是任意的,将其大小更改为 0 并将容量更改为至少 N(给定数字)的最佳做法是什么?

我的直接想法是:

void f(vector<int> &t, int N)
{
t.clear();
t.reserve(N);
}

但是我注意到了

A reallocation is not guaranteed to happen, and the vector capacity is not guaranteed to change(when std::vector::clear is called).

所以我想知道当原始容量大于给定的 N 时如何避免重新分配?

最佳答案

what's the best practice to change its size to 0 and capacity to N(a given number)? My direct idea is: ...

你的直接想法是正确的,也是最简单的选择。尽管有点迂腐,reserve 将容量更改为大于或等于给定的数字;不保证相等(但我测试过的所有实现确实会在以前的容量较小的情况下准确分配给定的数量)。

So I'm wondering how to avoid reallocating when the origin capacity is larger than the given N?

通过使用已选择在调用 clear 时不释放内存的标准库实现(即任何符合标准的实现,如答案 here 所示)。


保证的另一种方法(尽管 cplusplus.com 上的措辞薄弱,但似乎这不是必需的,因为应该保证上述内容)不重新分配(在 N > t.capacity()< 的情况下): 因为 vector 包含简单的整数,而且你似乎知道会有多少元素(正如你知道的那样保留),你可以简单地调用 t.resize(N) (到在不清除 vector 的情况下删除额外的元素(以防尺寸更大),然后继续覆盖现有元素,而不是推送新元素。

当然,这意味着您将无法观察到被覆盖的元素数量,因此这种方法并不适用于所有用例。如果您只是想用一个简单的循环填充 vector ,那很好。

如果新大小可能大于旧大小,您可能希望在调整大小之前保留,并且您不想过度分配。这是因为大多数实现都分配了精确的保留量(正如我提到的),但在调整大小时使用了乘法策略(据我所知,这些行为都没有得到保证,但我使用的实现与此行为一致)。

关于c++ - 制作 std::vector capacity>=N 和 size=0 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51186842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com