Является ли память в std::array непрерывной? Является ли следующая действительная/эффективная практика?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
Могу ли я передать ptr функции, ожидающие массив c-style?
Является ли память в std::array непрерывной? Является ли следующая действительная/эффективная практика?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
Могу ли я передать ptr функции, ожидающие массив c-style?
Да, он смежный, поскольку он в основном (и фактически) a 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для всех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не входит в интерфейсarrays. -end note]
Да память std::array является смежной. На VC10 он объявлен как:
template<class _Ty,
size_t _Size>
class array
{ // fixed size array of values
...
_Ty _Elems[_Size == 0 ? 1 : _Size];
};
Где _Elemes - не что иное, как простой массив заданного типа.