std::向量构造函数行为
std::vector constructor behavior
获取以下代码:
std::vector<std::vector<int>> v(10, 10);
此代码不使用libstdc++进行编译。不过,它确实使用Visual Studio的C++库进行编译。我所期望的行为是v
填充了10个大小为10的向量,这就是我在Visual Studio中得到的结果。
用VisualStudio调用的构造函数使用两个迭代器。构造函数本身定义为:
template<class _Iter>
vector(_Iter _First, _Iter _Last)
: _Mybase()
{ // construct from [_First, _Last)
_Construct(_First, _Last, _Iter_cat(_First));
}
模板函数_Construct
有两个版本。两者都有相同的签名,但其中一个从一个范围初始化向量,另一个用从第二个参数构造的值类型副本的N个副本初始化向量。在这种情况下,模板参数仅对_Construct
的第二版本有效。
结果是CCD_ 4填充有根据值10复制构建的向量的10个副本。通过这样构建它可以获得相同的代码路径,因为您必须使用libstdc++:才能获得相同的效果
std::vector<int> temp(10);
std::vector<std::vector<int>> v(10, temp);
这里哪种实现是正确的?这是libstdc++错误还是Visual Studio C++库的扩展?
编辑:只是澄清一下,我不是在问它是否应该调用范围构造函数。我在问哪个C++实现具有正确的行为,而不管它需要哪条路径来实现。
std::vector<std::vector<int>> v(10, 10);
这不应该编译,因为向量的单参数构造函数是显式的。
C++03:
explicit vector(size_type n, const T& value = T(), const Allocator& = Allocator());
C++11:
explicit vector(size_type n);
这意味着像10这样的数字不能隐式地变成大小为10的向量。
我所期望的行为是,v填充了10个大小为10 的矢量
这正是GCC/libstdc++4.1.2发生的情况。被称为的_Construct
void std::_Construct<std::vector<int>, int>(std::vector<int>*, int const&)
(省略分配器(。我不能告诉你这个标准是怎么说的,但我的直觉是,这是旧的GCC/libstdc++中的一个错误。
相关文章:
- std::向量与传递值的动态数组
- std::sort()函数无法对向量的一部分进行排序
- 如何在旧c++中初始化const-std向量
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在向量中删除 std::function<void()>?
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 使用 std::sort 对向量进行稳定排序
- 如何在C++中将字节向量(std::vector<uint8_t>)转换为不同的uint32_t,uint16_t和uint8_t变量
- C++程序中的向量 std::bad_alloc 错误
- 如何诊断保存和加载位向量(std::vector)的奇怪行为<bool>?
- 用SWIG包裹一个4维标准::向量 std::complex。<float>
- C++ 在抛出字符串向量"std::out_of_range"的实例后调用的终止
- 如何初始化 std::向量 std:固定长度对与默认值