使用MAP指针时运行时错误

runtime error when using pointer of map

本文关键字:运行时错误 指针 MAP 使用      更新时间:2023-10-16

如何使用指针访问地图元素?我搜索并得到了运行时错误的此信息:

#include<bits/stdc++.h>
using namespace std;
map<string, int> *myFruit;
int main()
{
    (*myFruit)["apple"] = 1;
}

正确的方法是什么?我搜索但找不到任何有用的东西。

在可能的情况下避免使用指针,尤其是对于简单的任务。更喜欢用值编程。

#include <map>
#include <string>
int main()
{
    std::map<std::string, int> myFruit;
    myFruit["apple"] = 1;
}

除了避免使用指针外,还有其他值得一提的东西。您的示例将myFruit定义为全局变量。指针容易出错,全球变量很危险,将它们放在一起,您可能迟早会陷入困境。由于main启动了您的程序,因此您可以将MyFruit传递给将使用它的功能,从而使变量的范围大大减少,从而使代码更容易理解。

通过阅读其中一条评论中链接的代码,我相信您可以通过多种方法可以改进您的代码。

  1. 函数应将其作为参数运行的所有数据获取。这消除了对全球群体的任何需求,唯一的例外应该是极端边缘案例。

  2. 尝试适当地命名您的功能,getsz是一个差的名称,get_size会更好,但是它仍然具有误导性,因为该函数不返回值,实际上会突变全局。没有人会期望观察到突变全局变量。

  3. 理想情况下,该方法将具有

    之类的签名
    int calculate_size(int vertexIndex, int parentVertexIndex, const std::vector<std::vector<int>>& vertices);
    

map<string, int> *myFruit;中,MyFruit是指向地图的指针。但是问问自己,它指向的地图实例是什么?答案是:没有。尚未将其指向任何实例。您根本没有初始化它。并且您的示例程序永远不会在任何地方创建地图的任何实例!

因此,尝试使用MyFruit会引起问题也就不足为奇了。

请记住,指针与指向的内容之间存在区别。如果这还不清楚,请在C 上找到一些好的教育材料并阅读它们。


在此示例中,我们可以通过创建(又名分配)指向指针的实例来解决问题。例如map<string, int> *myFruit = new map<string, int>();当然应该记住稍后再正确地 delete

尽管正如其他评论所涉及的那样,在这样一个简单的例子中,似乎很愚蠢,甚至使用这样的指针。直接创建一个实例会更容易,例如map<string, int> myFruit;

现在,如果您实际上是在尝试执行诸如将地图传递给函数之类的事情,那么您可能有理由通过指针(例如void SomeFunction(map<string, int> *parameter))。但是正如评论所提到的,这可能会通过参考(例如void SomeFunction(map<string, int> &parameter)

)更优雅地完成。

但是,如果您想做的其他事情确实认为您需要一个指针,并且如果您无法使其正常工作,那么也许您应该问一个有关您的问题的问题重新尝试做和原因。