std::array
中的内存是否连续?以下是有效/良好的做法吗?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
我可以将ptr
传递给期待c风格数组的函数吗?
答案 0 :(得分:29)
是的,它是连续的,因为它基本上(实际上)是type arr[10];
,但是像STL一样接口。它也不会在最轻微的挑衅下腐烂。
您可以安全地将&arr[0]
传递给期望C风格数组的函数,这就是它的设计目标。但是,要将其与STL算法一起使用,只需使用begin
和end
函数:
// 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
元素的实例,以便array
是一个不变量。a
的元素是连续存储的,这意味着如果array<T, N>
是&a[n] == &a[0] + n
,则它会服从所有{{1}的身份0 <= n < N
}}
§23.3.2.1 [array.overview] p2
:
数组是可以使用语法
初始化的聚合(8.5.1)
array<T, N> a = {
initializer-list};
此外,在p3
中,列出std::array
的成员:
T elems[N]; // exposition only
[注意:成员变量elems
仅用于展示,以强调array
是类聚合。名称elems
不是array
界面的一部分。 -end note ]
答案 1 :(得分:0)
是std::array
的记忆是连续的。在VC10上,它被声明为:
template<class _Ty,
size_t _Size>
class array
{ // fixed size array of values
...
_Ty _Elems[_Size == 0 ? 1 : _Size];
};
_Elemes
只是一个给定类型的简单数组。