std::vector::resize默认构造新元素的次数
How many times std::vector::resize should default-construct new elements?
我们的团队刚刚遇到了这里描述的相同问题http://forums.codeguru.com/archive/index.php/t-514404.html,即调用some_vec.resize(new_size)
,其中N>=2的N = new_size - some_vec.size()
和VC10默认构造所有N个新元素,而GCC默认构造单个元素,作为原型元素,为新元素复制构造它N次。
由于这是一个uuid向量,默认构造函数随机初始化每个新实例,我们最终使用GCC获得了N倍相同的uuid,使用VC获得了N个不同的uuid。这足以在一个平台上对我们的测试套件造成严重破坏,但在另一个平台却没有,而且找不到任何乐趣。
我的问题是:谁是对的?VC还是GCC?还是这是C++中一个未指明的受人喜爱的角落?TIA,--DD
我敢打赌,如果你用-std=c++0x
编译GCC,你会得到与MSVC相同的结果,即N个默认构造。这在C++11中发生了变化,请参见此处。现在有两个重载,一个只有默认构造新元素的新大小,另一个使用"prototype"参数来复制构造每个新元素。
现在,无论以何种模式编译,都要获得一致的结果,只需使用
v.resize(new_size, T());
背景信息:更改是必要的,因为现在有一些类型可以移动,但不能复制(如std::unique_ptr
)。旧的签名要求具有可复制性。现在,如果使用需要复制的操作,则标准容器类型的第一个模板参数只需要是可复制的。
相关文章:
- 静态堆栈函数不会 1) 输入第一个元素 2)添加新元素时识别旧元素
- 在二叉搜索树中插入新元素
- 如何输入数组的元素,每次获得新元素时,我们将其放在数组的中间?
- 将新元素添加到列表中,并返回对该元素的引用?
- 如果键不存在,使用 [] 运算符访问 STL Map 元素会添加新元素
- 向 std::list 添加新元素的复杂性
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 在指向对象的指针的动态数组上插入新元素
- c++ 向量push_back移动新元素
- 新元素将在std :: set中插入哪里
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- 在C++中,如何在没有新元素且不单独声明单个元素的情况下创建"std::initializer_list<base *>"?
- 在unordered_map/unordered_set中插入/放置新元素时的提示
- 将新元素添加到动态数组C
- 插入新元素时结束迭代器会获得更新
- 将新元素推送到函数指针映射中 "inline" ?
- 自定义容器在保留空间时不必要地创建新元素实例
- 删除前面元素并将新元素添加到最小堆 (std::p riority_queue)
- 2D-Array 会在存储新元素时删除元素本身
- 创建新元素崩溃后,tinyxml2 xmldocument parse