gpt4 book ai didi

c++ - "reserve or shrink"的正确方法指向已知 future 容量需求的 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:33 24 4
gpt4 key购买 nike

我已经围绕一个长期存在的 vector 的共同主题编写了无数软件模块,有时(以未指定的频率)必须更新其内容。

惯用语实现:

void LongLived::reconfigure(const InputT& whatever_input)
{
m_vector.clear();

m_vector.reserve(whatever_input.size());

populate(m_vector, whatever_input);
}

请注意,惯用的实现方式永远不会减少其内部缓冲区的容量。如果这不行怎么办?只需使用 shr​​ink_to_fit(),我想:

void LongLived::reconfigure(const InputT& whatever_input)
{
m_vector.clear();

m_vector.reserve(whatever_input.size());
m_vector.shrink_to_fit(whatever_input.size()); // ← Here

populate(m_vector, whatever_input);
}

哦,那该多好……但令我惊讶的是,它无法编译,因为 shr​​ink_to_fit() 不接受数字!

显然,应该使用 shr​​ink_to_fit() 的方式是先填充 vector 。然后,您调用 shr​​ink_to_fit(),它会事后根据 vector 中元素的数量推导出容量需求,但如果我可以事先告诉它,那显然不是最佳选择,因为现在,所有这些内容都必须移动。

目标:我希望在此上下文中使用函数 vector_reserve_or_shrink():

void LongLived::reconfigure(const InputT& whatever_input)
{
m_vector.clear();

vector_reserve_or_shrink(m_vector, whatever_input.size()); // ← Implement this!

populate(m_vector, whatever_input);
}

我实际上并不痴迷于从 vector 中删除每个未使用的字节。相反,我很乐意将它留给像 shr​​ink_to_fit() 这样定义的实现,它可能知道分配器的一些怪癖,并且可能选择什么都不做。这样,就不会冒险制作 abstraction inversion这否定了任何较低级别的优化。例如,假设分配器的粒度是 16:然后, vector 实现可能会在您要求时免费给您 15 个字节,据我所知,这只会适得其反。

最佳答案

使用这样的东西:

template <typename VECTOR>
void setCapacity(VECTOR &vector, std::size_t capacity) {
if (capacity < vector.size()) capacity = vector.size();
if (vector.capacity() > capacity) {
VECTOR v;
v.reserve(capacity);
std::size_t size = vector.size();
for (std::size_t i = 0; i < size; i++) {
v.emplace_back(std::move(vector[i]));
}
vector.swap(v);
} else {
vector.reserve(capacity);
}
}

它将 vector 容量设置为 capacity(如果可能),同时保留元素。而且它只进行一次分配。

关于c++ - "reserve or shrink"的正确方法指向已知 future 容量需求的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47762372/

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