当声明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
的向量。由于地图和地图集的大小不固定。
声明2D数组时,它们存储在连续的内存位置中,这很容易,因为声明它们时行数是固定的。而当我们声明一个二维向量vector
矢量对象不存储元素。它存储一个指向包含元素的连续内存块的指针。当您有std::vector<std::vector<int>>
时,外部向量包含指向包含向量对象的连续内存块的指针,每个对象都有一个指向包含int的连续内存块的指针。
std::map
和std::set
也不将元素存储在对象本身中。每个对象都包含一个指向包含元素的BST的指针。