2016-05-04 2 views
5

Is std::vector::begin() от C++11 эквивалент std::vector::data() в C++ 11? Причина, по которой я прошу об этом раньше, чем C++ 11, я использовал для обработки std :: vector :: begin() как указатель, но после C++ 11 это не так, и я не могу использовать эквивалент указателя , Итак, могу ли я использовать data() вместо C++ 11?Является std :: vector :: begin() from priorC++ 11 эквивалентно std :: vector :: data() в C++ 11?

+4

std :: vector :: begin() никогда не был указателем. –

+2

Если вы использовали для обозначения 'std :: vector :: begin()' как указатель, вы полагались на представление конкретной реализации 'std :: vector :: iterator' как указателей. Этого никогда не было гарантировано. – molbdnilo

+0

Вы используете '& (* std :: vector :: begin())' для получения указателя на векторные данные? – NathanOliver

ответ

8

Нет, begin возвращает итератор, тогда как data возвращает указатель. Для данной реализации это может быть одно и то же, но вы не должны рассчитывать на это.

+0

В дополнение к этому, память 'std :: vector' не гарантировалась быть смежной до C++ 11, хотя на практике реализация, которая делает иначе, может быть, немного глупо. – alcedine

+7

@ alcedine На самом деле это исправлено в C++ 03. Это был только C++ 98, и до этого это не гарантировало. – NathanOliver

+2

@ alcedine, не верно. Был contiguos от по крайней мере 2003, и у меня есть довольно сильное чувство, что это было contiguos в 98. – SergeyA

3

Использование итератора в качестве указателя является абсолютно неправильным, потому что оно определено реализацией. Если вам все еще нужно указатель на данные в итератора вы должны использовать адрес разыменованного итератора, как это:

std::vector<int> v; v.push_back(42); 
std::vector<int>::iterator it = v.begin(); 
int * p = &*it; 

И, конечно же, в C++ 11 вы можете использовать .data() как указатель на вектор элементов.

2

Это std :: vector :: begin() из предшествующего C++ 11 эквивалентно std :: vector :: data() в C++ 11?

Зависит от того, что вы подразумеваете под эквивалентом. Выделение либо приведет к ссылке на первый элемент в векторе, но итератор, возвращаемый функцией begin(), не может быть конвертирован в тип указателя, возвращаемый данными().

Причина, по которой я прошу об этом, раньше, чем C++ 11, я использовал для обработки std :: vector :: begin() как указатель, но после C++ 11 это не так, и я не могу приведение к эквиваленту указателя.

Ваш код работал через хорошую (или плохую) удачу, в зависимости от того, как вы на это смотрите.

Итак, могу ли я использовать данные() вместо C++ 11?

Есть два итератора пары, Straddle данные вектора по:

begin() к end()

и

data() в data() + size()

вы можете использовать либо в любом стандартном алгоритме а результат будет таким же.

В качестве хорошего стиля вы должны использовать begin() до end(), где вы можете (который будет почти всегда).

Смежные вопросы