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

时间:2011-04-26 14:45:43

标签: c++ stl containers

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

3 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分: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;
}

并用作:

auto myvec = make_reserved_vector<int>(32768);

答案 2 :(得分:0)

要创建一个向量,并在同一时间指定其容量,请创建一个具有所需容量的向量,将其复制到所需的元素中,并从复制返回的迭代器中删除。 如果构造函数很慢,只需编写另一个带有特殊参数的构造函数,这些参数只保留内存。

int main (int argc, char** argv) {
  std::vector<size_t> v (10, 0);
  size_t tmp [3] = {0, 1, 2};
  std::vector<size_t>::iterator i (v.begin ());
  i = std::copy ((const size_t*)tmp, (const size_t*) &tmp [3], v.begin ());
  v.erase (i, v.end ());
  std::cout << "\tv capacity == " << v.capacity () << std::endl;
}

将输出:

v capacity == 10