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
можно ли получить доступ ко всем элементам, хранящимся в такой вложенной структуре, "просто" и последовательно (с помощью указателя или аналогичного) так же, как это можно сделать для одномерного вектора?
Да, если:
-
вам нужно только добавить материал в конец вектора векторов, а
-
вы готовы заменить вектор векторов на конструкцию пользовательских данных
То, что вы можете сделать, это объединить все эти вспомогательные векторы в один непрерывный буфер, с другим буфером индекса, используемым для доступа к этому индексом ввода верхнего уровня.
См. мою статью здесь для более подробного обсуждения этого вопроса и примера реализации класса "скомпенсированный векторный вектор".