Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果可能,在堆栈内存中创建指向映射的指针数组_C++_Arrays - Fatal编程技术网

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 ;