内存是std::array
连续的吗?以下是有效/良好的做法吗?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
然后我可以传递ptr
给期望 c 样式数组的函数吗?
内存是std::array
连续的吗?以下是有效/良好的做法吗?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
然后我可以传递ptr
给期望 c 样式数组的函数吗?
是的,它是连续的,因为它基本上(实际上)是 a type arr[10];
,但具有类似 STL 的接口。它也不会因最轻微的挑衅而衰减为指针。
您可以安全地传递&arr[0]
给期望 C 样式数组的函数,这就是它的设计目标。然而,要将它与 STL 算法一起使用,只需使用begin
andend
函数:
// either members
std::sort(arr.begin(), arr.end());
// or free from <iterator>
std::sort(std::begin(arr), std::end(arr));
对于语言律师部分,§23.3.2.1 [array.overview] p1
:
标头
<array>
定义了一个类模板,用于存储固定大小的对象序列。数组支持随机访问迭代器。array<T, N>
存储N
类型元素的实例T
,因此这size() == N
是一个不变量。an 的元素array
是连续存储的,这意味着如果a
是 anarray<T, N>
那么它服从&a[n] == &a[0] + n
所有的标识0 <= n < N
。
并且§23.3.2.1 [array.overview] p2
:
数组是可以使用语法初始化的聚合(8.5.1)
array<T, N> a = {
初始化列表};
此外,在 中p3
,列出 的成员std::array
:
T elems[N]; // exposition only
[注意:成员变量elems
仅用于说明,以强调这array
是一个类聚合。该名称elems
不是array
的接口的一部分。——尾注]
是的,内存std::array
是连续的。在 VC10 上,它被声明为:
template<class _Ty,
size_t _Size>
class array
{ // fixed size array of values
...
_Ty _Elems[_Size == 0 ? 1 : _Size];
};
Where_Elemes
只不过是一个给定类型的简单数组。