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?
ответ
Нет, begin
возвращает итератор, тогда как data
возвращает указатель. Для данной реализации это может быть одно и то же, но вы не должны рассчитывать на это.
В дополнение к этому, память 'std :: vector' не гарантировалась быть смежной до C++ 11, хотя на практике реализация, которая делает иначе, может быть, немного глупо. – alcedine
@ alcedine На самом деле это исправлено в C++ 03. Это был только C++ 98, и до этого это не гарантировало. – NathanOliver
@ alcedine, не верно. Был contiguos от по крайней мере 2003, и у меня есть довольно сильное чувство, что это было contiguos в 98. – SergeyA
Использование итератора в качестве указателя является абсолютно неправильным, потому что оно определено реализацией. Если вам все еще нужно указатель на данные в итератора вы должны использовать адрес разыменованного итератора, как это:
std::vector<int> v; v.push_back(42);
std::vector<int>::iterator it = v.begin();
int * p = &*it;
И, конечно же, в C++ 11 вы можете использовать .data()
как указатель на вектор элементов.
Это 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()
, где вы можете (который будет почти всегда).
- 1. Используйте std :: vector :: begin vs begin (vector)
- 2. C++ 11 std :: vector в параллельной среде
- 3. C++ 11: std :: vector :: shrink_to_fit сложность
- 4. Ускорение std: .vector заполнение новым C++ 11 std :: async
- 5. C++ 11 std :: array vs static array vs std :: vector
- 6. Inheriting from std :: vector
- 7. Пустой std :: vector begin! = End
- 8. Инициализированные значением объекты в C++ 11 и std :: vector constructor
- 9. Vector move semantic C++ 11
- 10. std :: array или std :: vector from pointer
- 11. Как инициализировать список значений std :: vector в C++ 11?
- 12. Почему была изменена подпись std :: vector :: resize в C++ 11?
- 13. C++ 11 std :: array
- 14. Является std :: unique_ptr перемещен в std :: vector
- 15. sizeof() std :: vector (C++)
- 16. Сопряженное сравнение элементов std :: vector с использованием C++ 11 lambdas
- 17. Почему был изменен интерфейс конструктора std :: vector с C++ 11?
- 18. Что произошло, когда std :: vector = std :: vector?
- 19. C++ Warming std vector
- 20. C++ std :: vector problems
- 21. Как использовать std :: begin и std :: end без C++ 11?
- 22. Копирование std :: vector в std :: array
- 23. Struct Vector и итерация C++ 11
- 24. C++: std :: vector [] operator
- 25. Что такое хорошее применение std :: vector :: data?
- 26. arma :: vector mistaken with std :: vector
- 27. std :: vector versus std :: array в C++
- 28. Копирование std :: stack в std :: vector
- 29. Интересный std :: copy from std :: vector to std :: string поведение
- 30. Сравнение элементов std :: vector C++
std :: vector :: begin() никогда не был указателем. –
Если вы использовали для обозначения 'std :: vector :: begin()' как указатель, вы полагались на представление конкретной реализации 'std :: vector :: iterator' как указателей. Этого никогда не было гарантировано. – molbdnilo
Вы используете '& (* std :: vector :: begin())' для получения указателя на векторные данные? – NathanOliver