2008-10-29 1 views
55

Если у вас есть вектор STL, который был изменен, безопасно ли взять адрес элемента 0 и предположить, что остальная часть вектора будет следовать в памяти?Можно ли предположить, что хранилище векторных изображений STL всегда смежное?

например.

vector<char> vc(100); 
// do some stuff with vc 
vc.resize(200); 
char* p = &vc[0]; 
// do stuff with *p 

ответ

71

Да, это правильное предположение (*).

От стандарта C++ 03 (23.2.4.1):

Элементы вектора хранятся смежно, а это означает, что если v является вектор, где Т представляет некоторый тип , кроме bool, то он подчиняется личность & v [n] == & v [0] + n для все 0 < = n < v.size().

(*) ... но следите за тем, чтобы массив был перераспределен (аннулировать любые указатели и итераторы) после добавления к нему элементов.

+1

Если вы используете проект стандарта, или что-нибудь еще не ратифицированы и официально, пожалуйста, так сказать. Я не мог найти ничего подобного в нынешнем стандарте. – 2009-01-13 21:49:02

2

Да.

он должен быть непрерывным во все дни

10
+0

+1 за ссылку на C++ FAQ – 2010-02-26 11:06:01

+0

-1 для ссылки в качестве ответа – 2012-12-02 10:54:26

13

хранения всегда непрерывно, но он может двигаться как мощность вектора изменяется.

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

4

std::vector гарантирует, что элементы хранятся в непрерывном массиве и, следовательно, являются предпочтительной заменой массивов, а также могут использоваться для взаимодействия с зависимым от платформы низкоуровневым кодом (например, вызовами Win32 API). Чтобы получить указатель на использование массива:

&myVector.front(); 
27

Добавленная формулировка C++ 03, чтобы было ясно, что векторные элементы должны быть смежными.

C++ 03 23.2.4 Пункт 1 содержит следующую формулировку, которая не в стандартном документе C++ 98:

Элементы vector хранятся смежно, что означает, что если v является vector<T, Allocator> где T является некоторым типом кроме bool, то подчиняется идентичность &v[n] == &v[0] + n для всех 0 <= n < v.size().

Herb Sutter говорит об этом изменении в одной из своих записей в блоге, Cringe not: Vectors are guaranteed to be contiguous:

... примыкания фактически является частью векторной абстракции.Это так важно, на самом деле, что, когда было обнаружено, что стандарт C++ 98 не полностью гарантирует смежность, стандарт C++ 03 был изменен до , явно добавив гарантию.