我曾经在几个地方看到过推荐使用std::array在C ++中使用C风格的数组,声称这是一个更好,更安全的替代scheme,没有开销。 看到: 标准的容器数组没有超出它所需的元素的空间开销,[…]。 换句话说,它非常像一个没有问题的内置数组。 ( C ++ 11 FAQ ) 然而,据我所知,作为一个模板容器, 将会有一个开销,只要程序大小,因为它会生成代码为每个不同的Narrays是实例。 假设我的程序在不同的地方使用了std::array ,有N个不同的整数,这会导致代码臃肿吗? 这可以忽略不计吗? 我应该担心这一般的非types模板参数吗?
考虑下面的一段代码,C ++ 11编译器完全可以接受这段代码: #include <array> #include <iostream> auto main() -> int { std::array<double, 0> A; for(auto i : A) std::cout << i << std::endl; return 0; } 根据标准§23.3.2.8[ 零尺寸arrays ]: 1arrays应提供对特殊情况N == 0 。 2在N == 0的情况下, begin() == end() ==唯一值。 返回值 data()是未指定的。 3调用front()或back()调用一个零大小的数组是没有定义的。 4成员函数swap()应该有一个noexcept-speci fi cation,相当于noexcept(true) 。 如上所示,在C ++ 11中,零大小的std::array是完全允许的,与零大小的数组(例如, int A[0]; )相比,它们被明确禁止,但它们被一些编译器例如GCC)以未定义的行为为代价。 考虑到这个“矛盾”,我有以下几个问题: […]
在C ++ 11中,我将如何去编写一个函数(或方法),它需要一个已知types的未知大小的std ::数组? // made up example void mulArray(std::array<int, ?>& arr, const int multiplier) { for(auto& e : arr) { e *= multiplier; } } // lets imagine these being full of numbers std::array<int, 17> arr1; std::array<int, 6> arr2; std::array<int, 95> arr3; mulArray(arr1, 3); mulArray(arr2, 5); mulArray(arr3, 2); 在我的search过程中,我只find了使用模板的build议,但是这些看起来很乱(头文件中的方法定义),而我试图完成的东西太多了。 有一个简单的方法来做这个工作,就像一个简单的C风格的数组?
给定这个结构: struct Foo { std::array<int, 8> bar; }; 如果我没有Foo的实例,我怎样才能得到bar数组元素的数量?
是没有的 std::array<T,size>::array(const T& value); 一个疏忽? 这似乎对我有用,dynamic容器(如std::vector )确实有一个类似的构造函数。 我完全知道 std::array<T,size>::fill(const T& value); 但这不是构造函数,内存将首先被清零。 如果我想要所有-1 这样的人呢?
用C ++ 11 std::array ,我有保证std::array<T, N> x; 会默认初始化数组的所有元素? 编辑 :如果没有,是否有一个语法,将所有数组(包括零大小的数组)初始化所有元素的默认值? 编辑 :在cppreference ,默认的构造函数描述说: (constructor) (implicitly declared) (public member function) default-constructs or copy-constructs every element of the array 所以答案可能是肯定的。 但是我想根据标准或未来标准来确定。