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

问题描述 投票:0回答:3

如果我想将容量设置为

std::vector
,我必须调用
.reserve(...)
,是否有任何原因导致stl、
std::string
std::vector
中的容器的构造函数中没有容量参数?

c++ stl containers
3个回答
13
投票

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

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

是的,您可以添加第二个参数(如

bool reserve_instead_of_resize
)以便能够使用此构造函数进行初始调整大小和初始保留,但我认为最终结果会令人困惑。


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);

0
投票

确保不带参数的向量元素构造函数不执行任何操作(除了隐式内存预留),并且在使用 vec(容量)构建向量后仅删除向量

class LaClasse {
public :
  LaClasse () {}
  ~LaClasse () {}
  void write (std::ostream& os) const {os << val_;}
private :
  int val_;
};

int main (int argc, char* argv []) {
  std::vector<LaClasse> v (4);
  if (v.begin () != v.end ()) v.erase (v.begin (), v.end ());
  std::cout << "v.size () == " << v.size () << std::endl;
  std::cout << "v.capacity () == " << v.capacity () << std::endl;
  std::cout << "v == "; std::for_each (v.begin (), v.end (), [] (const auto& c) {c.write (std::cout); std::cout << " ";}); std::cout << std::endl;
  return 0;
}

输出 v.size() == 0 v.容量 == 4 v==

© www.soinside.com 2019 - 2024. All rights reserved.