如何从地图中获取值?

新手上路,请多包涵

我有一个 map 名为 valueMap 如下:

 typedef std::map<std::string, std::string>MAP;
MAP valueMap;
...
// Entering data.

然后我通过引用将此映射传递给函数:

 void function(const MAP &map)
{
  std::string value = map["string"];
  // By doing so I am getting an error.
}

如何从映射中获取值,该值作为对函数的引用传递?

原文由 Aneesh Narayanan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 472
2 个回答

std::map::operator[] 是一个非常量成员函数,并且您有一个 const 引用。

您要么需要更改 function 的签名,要么执行以下操作:

 MAP::const_iterator pos = map.find("string");
if (pos == map.end()) {
    //handle the error
} else {
    std::string value = pos->second;
    ...
}

operator[] 通过向映射添加默认构造值并返回对它的引用来处理错误。当您只有一个 const 引用时,这是没有用的,因此您需要做一些不同的事情。

如果您的程序逻辑以某种方式保证 "string" 已经是关键,您 可以 忽略这种可能性并编写 string value = map.find("string")->second; 。明显的问题是,如果你错了,那么你会得到未定义的行为。

原文由 Steve Jessop 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然有点晚了,但我仍然会回答,感谢之前对这个问题的回答,我能够伪造这个重用指针和值的类,它创建了两个映射来存储数据,如果有人感兴趣,这里是代码..

 template<class T1, class T2> class Bimap
{
std::map<T1, T2*> map1;
std::map<T2, T1*> map2;
public:
    void addRow(T1 &t1, T2 &t2){
        map1.insert(make_pair(t1, &t2));
        map2.insert(make_pair(t2, &t1));
    }
    T2* findForward(T1 t1){
        T2* value = map1.find(t1)->second;
        return value;
    }
    T1* findBackward(T2 t2){
        T1* value = map2.find(t2)->first;
        return value;
    }
};

使用类:

 //Init mapp with int,int
Bimap<int,int> mapp;

//Add a row(Record) in bimap
int a = 5;
int b = 7002;
mapp.addRow(a, b);

//Print a record
int *ans= mapp.findForward(a);
cout<<"Bimap Returned:"<<*ans<<endl;

原文由 Agent_Orange 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题