如果我想将容量设置为std::vector
,则必须致电.reserve(...)
,有没有任何理由说明stl,std::string
,std::vector
中容器的构造函数中没有容量参数?为什么在容器的构造函数中没有容量参数?
回答
有一个明显的原因:这样的构造函数是什么样的?
所有的序列容器都有一个可以用一个整数参数调用的构造函数。该构造函数将容器的大小调整为具有指定数量的元素。
是的,您可以添加第二个参数(如bool reserve_instead_of_resize
),以便能够将此构造函数用于初始大小调整和初始保留,但是我认为最终结果会令人困惑。
它可以采取另一种,对于保留的大小不同的整数参数 - 除了将与冲突在“T = size_t”的情况下,初始值的不同'const T&'参数(并且在其他情况下可以与另一个可转换的情况下混淆)。 – 2011-04-26 15:42:39
是的。还有一致性的问题:保留只对向量有意义,所以我们最终会为vector创建另一个构造函数。我认为所有的(或大多数)其他构造函数都可用于所有的序列容器(尽管字符串确实有一些额外的构造函数,但它也不是泛型容器)。对于它的价值,我很少使用储备。作为一种优化,它有时是有用的,但我认为,不足以保证另一个构造函数。 – 2011-04-26 15:53:51
我很偶尔使用'reserve'不是作为优化,而是为了防止重新分配的语义效应 - 迭代器和指针失效以及异常的可能性。我同意这不是真的值得一个构造函数,或者更确切地说是现有构造函数的一组重复项。在最糟糕的情况下,我认为你想用不重要的内容来构建并保留,而且你害怕重新分配的成本。所以你需要构造空的,然后保留,然后插入内容。 – 2011-04-26 16:01:44
你可以简单地做一个函数用于创建一个保留的向量:
// 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);
这是一个好主意。这解决了这个问题,但是C++库仍然有一个固有的问题:你可能不得不支付两个内存分配(第一个向量构造函数,当你不知道默认容量是什么时),然后第二个(当你预留和可能的释放和重新分配)。您的解决方案充分利用了这一点,但我认为C++委员会需要重新审视这个问题。 – rts1 2016-04-01 17:52:11
@ rts1:的确,这也是我的担忧。可能会有一个'默认尺寸储备',然后我们打电话给另一个储备。可能有多个构造函数,一个取大小。 – 2016-08-21 17:07:15
相当古老的q/a,但在某处我必须释放我的沮丧;)我不明白为什么在初始容量和初始大小之间进行选择时,他们会选择大小。如果我们可以选择初始容量,那么施工后可以更改尺寸而无需额外费用。就像现在一样,我要么需要一个可能不需要或者可能支付两次以获得我想要的容量的大小的矢量。 Imho反对C++的第一原则,不支付你不需要的东西。无论如何,你的函数可能是处理它的最好方法 – user463035818 2017-04-12 11:34:21
要创建载体,并在同一时间,指定其容量,创建具有所需容量的矢量,将其复制到您想要的元素中,并从通过复制返回的迭代器中擦除。 如果构造函数很慢,只需使用只保留内存的特殊参数编写另一个构造函数即可。
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
如果元素的构造函数有副作用(或者只是慢),那么这与创建一个空向量然后保留一些容量有不同的行为。 – 2017-02-21 10:25:17
如果控制器速度很慢,请在您的类中创建一个只保留内存的foo构造函数 – 2017-02-21 12:02:31
- 1. 没有参数的构造函数或参数构造函数
- 2. 为什么System.Data.SqlClient.SqlDataReader没有构造函数
- 3. 为什么STL容器没有虚拟析构函数?
- 4. 为什么元组没有无参数构造函数,而`[Serializable]`?
- 5. Mootools中的构造函数语法,容器的参数(noob)
- 6. 为什么优先级队列构造函数需要比较器的容量?
- 7. 在没有编译器定义的移动构造函数的容器中显式移动构造函数?
- 8. 为什么StringBuffer允许StringBuffer作为其构造函数的参数,即使StringBuffer没有StringBuffer构造函数?
- 9. 从Unity容器中自动解析构造函数参数
- 10. 将无参数构造函数设置为容器创建中的注入构造函数
- 11. 为什么没有在fill_n中调用移动构造函数
- 12. 构造函数参数中没有名字的变量?
- 13. 空的构造函数和没有构造函数有什么区别
- 14. 为什么allocator在构造函数中?
- 15. 与构造StructureMap容器参数
- 16. 为什么默认构造函数在父类中是必需的,如果它具有参数构造函数?
- 17. 为什么$ {}变量在我的上下文文件中没有被解释为构造函数参数值?
- 18. PhoneApplicationPage没有无参数构造函数
- 19. System.Data.Entity.Spatial.DbGeography - 没有无参数构造函数
- 20. 为什么IllegalAccessError不具有双参数构造函数?
- 21. C#依赖容器和构造函数
- 22. 使用仿函数没有对STL容器的默认构造函数
- 23. 为什么没有使用可变参数的List构造函数?
- 24. 为什么C++在迭代容器时调用复制构造函数?
- 25. 为什么ConcurrentQueue中没有容量?
- 26. 为什么servlet中没有构造函数?
- 27. 为什么编译器会抱怨超类没有构造函数,当默认的构造函数被自动赋予一个没有构造函数的类?
- 28. 为什么在C#中的泛型参数没有构造函数参数约束?
- 29. 为什么我无法从私有类中的参数化构造函数调用默认构造函数?
- 30. 为什么这个构造函数调用另一个没有参数?
矢量确实有一个构造函数大小 – 2011-04-26 14:47:23