Std::vector of std::vectors соприкосновение

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

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

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

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

К слову, это немного отличается, возможно ли доступ ко всем элементам, хранящимся в такой вложенной структуре, "просто" и последовательно (через указатель или аналогичный) так же, как это можно сделать для одномерного вектора?

Ответы

Ответ 1

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

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

Ответ 2

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

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

"возможно ли доступ ко всем элементам, хранящимся в такой вложенной структуре," просто "и последовательно (через указатель или аналогичный) так же, как это можно сделать для одномерного вектора?"
Для доступа к элементам std::vector лучше использовать метод operator[] или at(), чем получить адрес первого элемента и использовать арифметику указателя. Для многомерных массивов, представленных в виде вектора векторов, я предлагаю вам оставаться с operator[], который прост в использовании и легко читается: myVector[i][j]. Стоит посмотреть вектор:: at vs. vector:: operator []: >

Ответ 3

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

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

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"?

Ответ 4

можно ли получить доступ ко всем элементам, хранящимся в такой вложенной структуре, "просто" и последовательно (с помощью указателя или аналогичного) так же, как это можно сделать для одномерного вектора?

Да, если:

  • вам нужно только добавить материал в конец вектора векторов, а

  • вы готовы заменить вектор векторов на конструкцию пользовательских данных

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

См. мою статью здесь для более подробного обсуждения этого вопроса и примера реализации класса "скомпенсированный векторный вектор".