使用map指针时的运行时错误

时间:2016-12-27 18:42:58

标签: c++

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

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

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

2 个答案:

答案 0 :(得分:2)

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

#include <map>
#include <string>

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

除了避免指针外,还有其他一些值得一提的东西。您的示例将myFruit定义为全局变量。指针容易出错,全局变量很危险,把它们组合在一起你迟早会遇到麻烦。由于main启动了你的程序,你可以将myFruit传递给将使用它的函数,从而大大减少变量的范围,从而使代码更容易理解。

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

  1. 函数应将其操作的所有数据作为参数。这消除了对全局变量的任何需要,唯一的例外应该是极端边缘情况。

  2. 尝试恰当地命名您的函数,getsz是一个不好的名字,get_size会更好,但它仍然会产生误导,因为函数没有返回值,它实际上会改变一个全球。没有人会期望一个getter 可观察地变异一个全局变量。

  3. 理想情况下,该方法会有像

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

答案 1 :(得分:1)

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)

但是如果你正在尝试做其他事情,你真的认为你需要一个指针,如果你不能使它正常工作,那么也许你应该提出一个更多关于你的内容的问题。实际上是在尝试做以及为什么。