Распределение памяти в C ++ STL для динамических c контейнеров - PullRequest
1 голос
/ 27 апреля 2020

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

В то время как когда мы объявляем 2D-вектор vector<vector<int>> v, как это происходит? это работает. Так как количество рядов совсем не фиксировано. Моим первым предположением было то, что новый вектор, в который вы помещаете push_back, распределяется случайным образом, но даже если это не сработает, так как эти векторы int доступны в произвольном порядке.

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

vector<vector<int>> vmain;

vector<int> a = {1, 2, 3};
vector<int> b = {1, 2, 3};
vector<int> c = {1, 2, 3};

vmain.push_back(a);
vmain.push_back(b);
vmain.push_back(c);

хранится что-то похожее на

vector<&vector<int>> vmain; //vector of pointer to vector

vector<int> a = {1, 2, 3};
vector<int> b = {1, 2, 3};
vector<int> c = {1, 2, 3};

vmain.push_back(&a);
vmain.push_back(&b);
vmain.push_back(&c);

Пожалуйста, скажите мне, если это правильный путь.

А также для вектора карт или наборов vector<map<int, int>> v1 и vector<set<int>> v2. Размер карт и наборов не фиксирован.

1 Ответ

0 голосов
/ 27 апреля 2020

Векторный объект не хранит элементы. Он хранит указатель на непрерывный кусок памяти, содержащий элементы. Если у вас есть std::vector<std::vector<int>>, то внешний вектор содержит указатель на непрерывный кусок памяти, содержащий векторные объекты, каждый из которых имеет указатель на непрерывный кусок памяти, содержащий целые числа.

std::map и std::set также не храните элементы в самом объекте. Каждый объект содержит указатель на BST, содержащий элементы.

...