Разница между std :: array begin () и data () - PullRequest
1 голос
/ 17 апреля 2020

В чем разница между std::array методом begin() и data()? Например:

std::array<int, 5> = { /* numbers */ };
int* it = array.begin();
int* data = array.data();
// it and data are same here

Могут ли они быть разными в зависимости от типа? Или, может быть, нет никакой разницы, и эти методы просто соответствуют другим структурам данных C ++.

Ответы [ 2 ]

5 голосов
/ 17 апреля 2020

В принципе они не одинаковы.

То, что std::array::begin возвращает, является итератором , тип которого определяется реализацией; это может быть указатель в виде std::array::data возвратов (указатель удовлетворяет требованию итератора), но не обязательно.

Этот код компилируется или не зависит от реализации, например, этот код не будет компилироваться с MSV C, но компилируется с Clang .

Error(s):
source_file.cpp(7): error C2440: 'initializing': cannot convert from 'std::_Array_iterator<_Ty,5>' to 'int *'
        with
        [
            _Ty=int
        ]
source_file.cpp(7): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
0 голосов
/ 17 апреля 2020

Оба не одинаковы случайно. std::array::data тип возвращаемого значения value_type и std::array::begin тип возвращаемого значения iterator.

std::array::begin возвращает итератор, указывающий на первый элемент, но std::array::data возвращает указатель на первый элемент в объект массива.

iterator - это итератор произвольного доступа типов и существует реализация для него, и value_type определен в массиве как псевдоним его первого параметра шаблона (T).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...