首页 > 解决方案 > 保留时通过实现定义的因素强制增加向量容量

问题描述

所以我有一个类包装了一个向量,该向量具有不变量,vec.capacity() > vec.size()因此我可以始终(临时)emplace_back 再分配一个元素而无需重新分配。我的第一个想法是调用vec.reserve(vec.size() + 1)每个插入,但正如在这个 stackoverflow 线程中看到的那样,这是低效的,并且插入经常被调用。(pop_back也是如此,因此元素的最大数量远低于插入调用的数量。)

我当前的简化实现看起来像这样:

#include <vector>

template<typename T>
class VecWrapper {
private:
    std::vector<T> vec;

public:
    [[nodiscard]] auto insert(T new_element)
    {
        vec.emplace_back(std::move(new_element));
        if (vec.capacity() == vec.size()) {
            vec.emplace_back(vec.back());
            vec.pop_back();
        }
    }
};

根据实现定义的策略,是否有一种不太尴尬的方式来触发向量的容量扩展?请注意,T不一定是默认可构造的。

标签: c++c++17stdvectorimplementation-defined-behavior

解决方案


推荐阅读