【发布时间】:2017-11-20 02:44:38
【问题描述】:
我定义了一个简单的结构 EdgeList,它只是一个 unordered_map,将字符串键与字符串的 set 关联起来。
class EdgeList{
private:
std::unordered_map<std::string,std::set<std::string>> map;
public:
EdgeList(){};
void insert(std::string key,std::string item);
std::set<std::string> operator[](std::string key);
};
void EdgeList::insert(std::string key,std::string item)
{
if(map.count(key)==0) //key not already in map
{
std::set<string> newset;
map.emplace(key,newset);
}
map[key].insert(item);
}
std::set<string> EdgeList::operator[](string key){
return map[key];
}
EdgeList::insert 只是检查该键是否已经存在于unordered_map 中(如果不存在则创建一个新集合)并将该项目插入到相关集合中。 EdgeList::operator[] 返回与输入键关联的集合。
这一切都很简单,但是当我尝试访问EdgeList 中的数据时出现了问题。当我尝试类似
EdgeList el;
//populate el
string KeyInEdgeList;
for(auto it=el[KeyInEdgeList].begin();it!=el[KeyInEdgeList].end();++it)
{
std::cout << *it << std::endl;
}
可能会发生什么?类定义有错误吗?由于某种原因,我不能使用迭代器吗?我已经束手无策了,这应该不复杂。
【问题讨论】:
-
std::map的operator[]creates a key if it doesn't exist,所以你在insert(string, string)中的if语句是多余的。出于同样的原因,在for循环中,您正在使用operator[]创建一个空集,然后尝试取消引用循环内空集上的迭代器。
标签: c++ c++11 segmentation-fault set unordered-map