単純な構造のEdgeListを定義しました。文字列のset
と単純にunordered_map
が関連付けられています。C++:unordered_mapでデータにアクセスして設定するときのsegfault
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::set<std::string> operator[](std::string key);
^^^^^^^^^^^^^^^^^^^^^
新しいstd::set
が基礎となるマップからその式の最後に破棄されますこの関数を呼び出すたびに、コピーされ、次のとおりです。
'のstd :: map'の'演算子[] '[作成:範囲ベースのために何があなたの
operator[]
参照を返し、その後、かかわらず、使用していされてやりたいキーが存在しない場合はこれを参照してください(http://en.cppreference.com/w/cpp/container/map/operator_at)ので、 'insert(string、string)'の 'if'文は冗長です。同様の理由から、 'for'ループでは、' operator [] 'で空のセットを作成し、ループ内の空のセットでイテレータを逆参照しようとします。 – cantordust