内存分配和在c ++中使用std :: map

时间:2014-01-03 08:48:15

标签: c++ map

我正在阅读有关地图c ++字典实现的内容。我在网上的某个地方读了一段代码,里面有以下几行。

map <int, int> A[100005];
A[1][2]=1;

请解释一下如何分配内存。它是否与2-D阵列的方式相同,或者在插入时动态增加。

在给定第二行代码的情况下,如何在地图中插入。

3 个答案:

答案 0 :(得分:3)

std::map通常是自平衡二元搜索树 1 。这是一个基于节点的数据结构,与数组完全不同。通常,数据是动态分配的。你在这里有什么:

map <int, int> A[100005];

是一个带有自动存储的映射数组,因此在退出声明它的作用域时,将会销毁100005个二进制搜索树的简单数组。

所以这个

A[1][2]=1;

将键值对(2,1)添加到数组中的第二个映射。

C ++标准没有规定应该如何准确地实现std::map,而是为各种操作的复杂性和迭代器有效性设置条件,这意味着它实际上是作为自平衡BST实现的,通常为red-black tree

答案 1 :(得分:0)

在这种情况下,我认为A是一个静态数组的事实令你感到困惑。看看这个例子:

map <int, int> A;
A[2]=1;

没什么特别的吗?现在,如果您回到原始案例并认为A[1]只是阵列中的一个地图,您会发现它没有太大的不同。

答案 2 :(得分:0)

您可以使用该代码更轻松地解释该示例:

map <int, int> A[100005];
A[1][2]=3; // change: 3 instead of 1, at the right side of the =

第一行在堆栈上创建一个大小为100005的数组(自动存储),并且该数组的元素的类型为map<int, int>map是一个对象,它在节点上动态地(在堆上)分配binary search tree pair<int, int>。它还强制将每对作为不同的第一个组件(与std::multimap的区别)。 A[1]是数组中的第二个映射(因为数组的索引从0开始),A[1][2]=3等同于A[1].operator(2)=3类型为m的映射std::map<X,Y>存储XY类型元素之间的映射。给定X x后,m[x]会提供对Y类型对象的引用。请参阅documentation of map::operator[]。在您的情况下,XYint。最后,A[1][2]=3获取数组的第二个地图A[1]并将3存储在A[1][2]返回的引用A[1].map<int,int>::operator[](2)中。