如何使用指针访问地图元素?我搜索并得到了运行错误:
#include<bits/stdc++.h>
using namespace std;
map<string, int> *myFruit;
int main()
{
(*myFruit)["apple"] = 1;
}
这是正确的方法吗?我搜索但找不到任何有用的东西。
答案 0 :(得分:2)
尽可能避免使用指针,尤其是对于简单的任务。喜欢用值编程。
#include <map>
#include <string>
int main()
{
std::map<std::string, int> myFruit;
myFruit["apple"] = 1;
}
除了避免指针外,还有其他一些值得一提的东西。您的示例将myFruit
定义为全局变量。指针容易出错,全局变量很危险,把它们组合在一起你迟早会遇到麻烦。由于main
启动了你的程序,你可以将myFruit传递给将使用它的函数,从而大大减少变量的范围,从而使代码更容易理解。
通过阅读其中一条评论中链接的代码,我相信有很多方法可以改善您的代码。
函数应将其操作的所有数据作为参数。这消除了对全局变量的任何需要,唯一的例外应该是极端边缘情况。
尝试恰当地命名您的函数,getsz
是一个不好的名字,get_size
会更好,但它仍然会产生误导,因为函数没有返回值,它实际上会改变一个全球。没有人会期望一个getter 可观察地变异一个全局变量。
理想情况下,该方法会有像
这样的签名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> ¶meter)
。
但是如果你正在尝试做其他事情,你真的认为你需要一个指针,如果你不能使它正常工作,那么也许你应该提出一个更多关于你的内容的问题。实际上是在尝试做以及为什么。