为什么容器的构造函数中没有容量参数?

hid*_*yat 17 c++ containers stl

如果我想将容量设置为std::vector我必须调用.reserve(...),是否有任何理由为什么stl中的容器的构造函数中没有容量参数std::string,std::vector

Jam*_*lis 13

有一个明显的原因:这样的构造函数会是什么样子?

所有序列容器都有一个可以用单个整数参数调用的构造函数.该构造函数调整容器的大小以具有指定数量的元素.

是的,您可以添加第二个参数(例如bool reserve_instead_of_resize)以便能够将此构造函数用于初始调整大小和初始预留,但是我认为最终结果会令人困惑.

  • 我偶尔使用`reserve`作为优化,但为了防止重新分配的语义效应 - 迭代器和指针失效以及异常的可能性.我同意它不值得构造函数,或者更确切地说是现有构造函数的一整套重复.在最糟糕的情况下,我认为你想用非平凡的内容构建并保留,你害怕重新分配的成本.所以你需要构造空,然后保留,然后插入内容. (2认同)

Vik*_*ehr 11

您可以简单地创建一个用于创建保留向量的函数:

// make_reserved_vector
template <typename... T>
std::vector<T...> make_reserved_vector(size_t n) {
    std::vector<T...> vec;
    vec.reserve(n);
    return vec;
}
Run Code Online (Sandbox Code Playgroud)

并用作:

auto myvec = make_reserved_vector<int>(32768);
Run Code Online (Sandbox Code Playgroud)

  • 这是一个好主意.这解决了这个问题,但C++库仍有一个固有的问题:你可能需要支付两个内存分配(第一个向量构造函数,当你不知道默认容量是什么时),然后是第二个(当你保留并可能解除分配和重新分配).您的解决方案充分利用了这一点,但我认为C++委员会需要重新审视这个问题. (4认同)