【发布时间】:2011-08-13 02:53:46
【问题描述】:
如果我想将容量设置为std::vector,我必须调用.reserve(...),是否有任何理由在stl、std::string、std::vector 中的容器的构造函数中没有容量参数?
【问题讨论】:
-
vector 确实有一个构造函数,它需要一个大小
标签: c++ stl containers
如果我想将容量设置为std::vector,我必须调用.reserve(...),是否有任何理由在stl、std::string、std::vector 中的容器的构造函数中没有容量参数?
【问题讨论】:
标签: c++ stl containers
有一个明显的原因:这样的构造函数会是什么样子?
所有的序列容器都已经有一个构造函数,可以用一个整数参数调用。该构造函数将容器的大小调整为具有指定数量的元素。
是的,您可以添加第二个参数(如 bool reserve_instead_of_resize),以便能够将此构造函数用于初始调整大小和初始保留,但我认为最终结果会令人困惑。
【讨论】:
T = size_t 的情况下与初始值的不同 const T & 参数冲突(并且可能与它混淆在其他情况下,其中一个可以转换为另一个)。
reserve 不是作为优化,而是为了防止重新分配的语义影响——迭代器和指针失效以及出现异常的可能性。我同意它不值得一个构造函数,或者更确切地说是现有构造函数的一整套副本。在最坏的情况下,我认为你想用非平凡的内容构建并保留,你害怕重新分配的成本。所以需要先构造空,然后保留,再插入内容。
std::reserve来回答。我仍然不得不同意这不值得。
您可以简单地创建一个用于创建保留向量的函数:
// 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);
【讨论】:
要创建一个向量,并同时指定其容量,请创建一个具有所需容量的向量,将所需的元素复制到其中,然后从复制返回的迭代器中擦除。 如果构造函数很慢,只需编写另一个带有特殊参数的构造函数,只保留内存。
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 容量 == 10
【讨论】: