动态容器的C ++ STL中的内存分配

问题描述 投票:1回答:1

当声明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>> v1vector<set<int>> v2的向量。由于地图和地图集的大小不固定。

声明2D数组时,它们存储在连续的内存位置中,这很容易,因为声明它们时行数是固定的。而当我们声明一个二维向量vector ] >>

c++ arrays vector reference stl
1个回答
0
投票

矢量对象不存储元素。它存储一个指向包含元素的连续内存块的指针。当您有std::vector<std::vector<int>>时,外部向量包含指向包含向量对象的连续内存块的指针,每个对象都有一个指向包含int的连续内存块的指针。

std::mapstd::set也不将元素存储在对象本身中。每个对象都包含一个指向包含元素的BST的指针。

© www.soinside.com 2019 - 2024. All rights reserved.