如果我想将容量设置为
std::vector
,我必须调用.reserve(...)
,是否有任何原因导致stl、std::string
、std::vector
中的容器的构造函数中没有容量参数?
有一个明显的原因:这样的构造函数会是什么样子?
所有序列容器都已经有一个可以使用单个整数参数调用的构造函数。 该构造函数调整容器的大小以包含指定数量的元素。
是的,您可以添加第二个参数(如
bool reserve_instead_of_resize
)以便能够使用此构造函数进行初始调整大小和初始保留,但我认为最终结果会令人困惑。
您可以简单地创建一个用于创建保留向量的函数:
// 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);
确保不带参数的向量元素构造函数不执行任何操作(除了隐式内存预留),并且在使用 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==