C++ 如果可能,在堆栈内存中创建指向映射的指针数组
因此,正如标题所解释的,我需要声明一个指向映射的指针数组 例如:C++ 如果可能,在堆栈内存中创建指向映射的指针数组,c++,arrays,C++,Arrays,因此,正如标题所解释的,我需要声明一个指向映射的指针数组 例如: map<int,int>* mp[10] ; mp[0] = new map<int,int>() ; mp[0][0] = 21 ; cout<<mp[0][0]<<endl ; 好的。这意味着mp[0][0]是一个映射,而不是mp中的第0个映射,我们将0的值作为21。这意味着mp[0]是一个映射数组。这意味着语句map*mp[10]实际上创建了一个数组数组 那么,mp[0]=
map<int,int>* mp[10] ;
mp[0] = new map<int,int>() ;
mp[0][0] = 21 ;
cout<<mp[0][0]<<endl ;
好的。这意味着mp[0][0]
是一个映射,而不是mp
中的第0个映射,我们将0的值作为21。这意味着mp[0]
是一个映射数组。这意味着语句map*mp[10]
实际上创建了一个数组数组
那么,mp[0]=newmap()在做什么?它不是在堆中创建一个类型为map
的对象,并将其放入mp[0]
这让我困惑,质疑我的基础。如何创建指针数组
当我这样做时:
map<int,int>* mp = new map<int,int>() ;
mp[0][21] = 99 ;
cout<<mp[0][21]<<endl ;
map*mp=newmap();
mp[0][21]=99;
库特
这意味着mp[0]是一个映射数组。这意味着语句map*mp[10]实际上创建了一个数组数组
你的陈述是错误的。C++中的指针和数组是密切相关的(来自C):所以:
等于
*(pointer + 0) // or even
*pointer
这并不意味着这个指针指向一个元素数组。因此,在代码中使用额外的[0]作为解引用和语句的不可读等价物:
mn[0][0] = 25;
等于:
*(mn[0]) = 25;
显然存在问题-将整数分配给std::map
,应该是:
(*mn[0])[0] = 25;
这意味着mp[0][0]是一个映射,而不是mp中的第0个映射
mp
不包含贴图。它包含指向映射的指针
这意味着mp[0]是一个映射数组
这并不意味着mp[0]
是数组索引0处的指针
这意味着语句map*mp[10]
实际上创建了一个数组数组
它声明了一个指针数组
那么,mp[0]=newmap()在做什么?它不是在heap中创建map类型的对象,并将其放入mp[0]中吗
它确实创建了一个map
类型的动态对象。但该对象并没有“放入”mp[0]
。该对象位于免费存储区中。mp[0]
中存储的是指向对象的指针
如何创建指针数组
您已经成功创建了指针数组。您没有做到的是通过数组中的指针间接访问映射-从另一个角度看,当您可能试图使用映射的下标运算符时,您意外地通过使用下标运算符间接访问了指针:
mp[0][0] = 21 ;
^ ^ ^
| | Assignment of value 21 into map; ill-formed
| index 0 of pointer; type: map
index 0 of array; type: pointer
以下是正确的:
mp[0][0][0] = 21 ;
^ ^ ^ ^
| | | Assignment of integer; OK
| | The value mapped to key 0; type: int
| index 0 of pointer; type: map
index 0 of array; type: pointer
然而,使用下标操作通过指针访问单个对象有点令人困惑。以下是比较传统的:
(*mp[0])[0] = 21 ;
要理解等价性,请记住a[b]
与指针的*(a+b)
相同。因此a[0]
与*a
相同
另外,几乎不需要动态分配std::map
。创建一个映射数组而不是映射指针数组将更简单、更高效
p.p.S你泄露了动态地图。避免直接拥有指针(即除非您需要,否则不要动态分配,并且在需要时使用智能指针)。不,mp
是指针数组,mp[0]
是指向映射的指针,mp[0][0]
相当于*mp[0]
,这是一个映射<代码>mp[0][0][0]=21
或(*mp[0])[0]=21代码>可以。问题代码中没有第15行。后真实代码。这种结构正是我向不喜欢的人建议的。说真的,你可以在C++中做类似的事情,但是你最好不要这样做。如果你介绍了这种方法的背景/基本原理,你可能会得到更好的建议。为什么要提出这些建议?动态分配标准容器几乎总是不必要的(/错误)。如果你想要一个映射数组,你应该使用<代码> STD::Suth<<代码>或当动态大小完全一致的向量:“这是C++,而不是C!”你有各种各样的标准容器类型,你应该利用这些,而不是用指针来调换。它们速度快,效率高,并且经过调试。编译器现在也可以在编译时捕捉到更多愚蠢的错误。你让我在高效的部分。你迫使我发布这个用例。在上面,先生。加上背景。
mp[0][0][0] = 21 ;
^ ^ ^ ^
| | | Assignment of integer; OK
| | The value mapped to key 0; type: int
| index 0 of pointer; type: map
index 0 of array; type: pointer
(*mp[0])[0] = 21 ;