Вопрос по c++ – std :: вектор std :: векторы смежности

17

я знаю этоstd::vector<T> внутренне хранит эти данные непрерывно (если это неstd::vector<bool>) как в старомC++03 стандарт и новыйC++11.

Хорошие вопросы об обработке стека, которые решают эту проблему и цитируют стандарт:ответ, ответ.

Как насчет данных внутри вложенных векторов?std::vector <std::vector <T> >? Как это хранится?

Если каждый внутренний вектор должен хранить свои данные непрерывно, как это может быть правдой, что&v[n] == &v[0] + n for all 0 <= n < v.size().

Чтобы выразить это немного по-другому, можно ли получить доступall the elements хранится в такой вложенной структуре "просто" и последовательно (через указатель или подобное) так же, как это можно сделать для одномерного вектора?

Ваш Ответ

4   ответа
5

std::vector< std::vector<T> > является вектором объектов, которые хранятся в непрерывном блоке памяти. Тот факт, что эти объекты также являются векторами, не имеет значения.

Хотя элементы вектора хранятся в непрерывном блоке памяти, память, в которой находятся элементы, не является частью самого векторного объекта.

"is it possible to access all the elements stored in such nested structure "simply" and sequentially (via a pointer or similar) the same way it can be done for a 1-D vector?"
Для доступа к элементамstd::vectorэто лучше использоватьoperator[] или жеat() метод, чем получение адреса первого элемента и использование арифметики указателя. Для многомерных массивов, представленных как вектор векторов, я предлагаю вам остаться сoperator[], который прост в использовании и легко читается:myVector[i][j], Стоит посмотретьvector :: at vs. vector :: operator [] также :)

6

Чтобы ответить на ваш последний вопрос: Нет. Элементы вектора векторов не хранятся непрерывно.

Рассмотрим следующий код:

std::vector<std::vector<int> > vv;
.... fill in v[0], v[1], v[2], etc
std::vector <int> & v = vv[1];
v.push_back (23);

Если бы они все хранились непрерывно, то это привело бы к перемещению каждого элемента в vv [2], vv [3] и т. Д. Как это могло бы сработать, если вы просто воздействуете на один вектор v?

Я не имел смысла, чтобы это работало. С другой стороны, требование непрерывности сбило меня с толку в комбинации. penelope
20

Нет. Элементыvector хранятся в динамически выделенном блоке памяти; в противном случае, емкостьvector не может увеличиться.vector Объект просто содержит указатель на этот блок.

Требование, чтобы элементы были сохранены последовательно, применяется только к самим элементам, а не к любым динамически размещаемым элементам этих элементов.

+1 за указание на рост емкости вектора :)
1

is it possible to access all the elements stored in such nested structure "simply" and sequentially (via a pointer or similar) the same way it can be done for a 1-D vector?

Да,if:

  • you only ever need to add stuff to the end of your vector of vectors, and

  • you're willing to replace the vector of vectors construct with a custom data structure

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

Увидетьмоя статья здесь для более подробного обсуждения этого и примера «свернутого векторного вектора»; реализация класса ..

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