Действительно ли безопасно предположить, что устройство хранения данных вектора STL всегда непрерывно?

Взгляните на модуль vkbeautify .

Это версия python моего очень популярного плагина javascript / nodejs с тем же именем. Он может печатать / минимизировать XML, JSON и текст CSS. Ввод и вывод могут быть строковыми / файлами в любых комбинациях. Он очень компактный и не имеет никакой зависимости.

Примеры:

import vkbeautify as vkb

vkb.xml(text)                       
vkb.xml(text, 'path/to/dest/file')  
vkb.xml('path/to/src/file')        
vkb.xml('path/to/src/file', 'path/to/dest/file') 

55
задан Ferruccio 29 October 2008 в 17:44
поделиться

6 ответов

Да, который является допустимым предположением (*).

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

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

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

72
ответ дан einpoklum - reinstate Monica 7 November 2019 в 17:11
поделиться
10
ответ дан Jasper Bekkers 7 November 2019 в 17:11
поделиться

да.

это должно alway быть непрерывно

2
ответ дан Keith Nicholas 7 November 2019 в 17:11
поделиться

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 об этом изменении в одной из его записей в блоге, Съеживаются нет: Векторы, как гарантируют, будут непрерывны :

... смежность является на самом деле частью векторной абстракции. It’s, столь важный, на самом деле, что, когда это было обнаружено, что C++ 98 стандартов didn’t полностью гарантирует смежность, C++, 03 стандарта были исправлены для явного добавления гарантии.

27
ответ дан Michael Burr 7 November 2019 в 17:11
поделиться

Устройство хранения данных всегда непрерывно, но оно может переместиться, поскольку способность вектора изменяется.

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

13
ответ дан Adam Holmberg 7 November 2019 в 17:11
поделиться

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

&myVector.front();
4
ответ дан Kevin Panko 7 November 2019 в 17:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: