我正在阅读有关地图c ++字典实现的内容。我在网上的某个地方读了一段代码,里面有以下几行。
map <int, int> A[100005];
A[1][2]=1;
请解释一下如何分配内存。它是否与2-D阵列的方式相同,或者在插入时动态增加。
在给定第二行代码的情况下,如何在地图中插入。
答案 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>
存储X
和Y
类型元素之间的映射。给定X x
后,m[x]
会提供对Y
类型对象的引用。请参阅documentation of map::operator[]
。在您的情况下,X
和Y
为int
。最后,A[1][2]=3
获取数组的第二个地图A[1]
并将3
存储在A[1][2]
返回的引用A[1].map<int,int>::operator[](2)
中。