使用 std::map 和 std::pair 作为键并作为值列出
Using std::map with std::pair as a key and list as value
所以我有下面的地图parseTable
std::map<std::pair<Symbol, Symbol>, list<Symbol> > parseTable;
如果我以这种方式初始化我的地图,我对如何访问列表值感到困惑:
std::map<std::pair<Symbol, Symbol>, list<Symbol> > parseTable = {
{{Symbol::Input, Symbol::OpenPar}, {Symbol::Expr, Symbol::Semicolon, Symbol::InputP}},
{{Symbol::Input, Symbol::Ident}, {Symbol::Expr, Symbol::Semicolon, Symbol::InputP}},
{{Symbol::Input, Symbol::Number}, {Symbol::Expr, Symbol::Semicolon, Symbol::InputP}}
};
我想在使用地图的 find()
功能时单独访问列表中的每个值。
这是我想出的,但我无法获得对该索引值的引用:
if (parseTable.find(std::pair(stack_symbol.top(), current_symbol)))
std::map::find
将 return 指向已找到元素的迭代器,如果未找到则指向 end
。该迭代器将指向 std::pair<const Key, Value>
,在您的情况下将转换为
std::pair< const std::pair<Symbol, Symbol>, list<Symbol> >
你想要的是这样的
auto it = parseTable.find(std::pair(stack_symbol.top(), current_symbol));
if (it != parseTable.end()) { // A match was found
//it->first is std::pair<Symbol, Symbol>
//it->second is list<Symbol>
for (auto& symbol : it->second) {
//symbol is each individual value in the list
... do something with symbol
}
}
这不是地图键的最佳选择,它不会让地图得到有效利用。
std::map::find() return 指向找到搜索项的位置的迭代器,如果未找到,则 std::map::end()
。因此,在您的 if
语句中,您需要检查一下:
std::map<std::pair<Symbol, Symbol>, list<Symbol> >::iterator iter =
parseTable.find(std::pair(stack_symbol.top(), current_symbol)) //or auto with C++11
if (iter != parseTable.end())
find
returns 一个迭代器,用于访问对象(类型为 std::pair<std::pair<Symbol, Symbol>, list<Symbol>>
,您需要解引用运算符 *
Symbol currentSymbol = (*iter).first.second; //dummy example to show the use
std::list<Symbol> myList = (*iter).second'
所以我有下面的地图parseTable
std::map<std::pair<Symbol, Symbol>, list<Symbol> > parseTable;
如果我以这种方式初始化我的地图,我对如何访问列表值感到困惑:
std::map<std::pair<Symbol, Symbol>, list<Symbol> > parseTable = {
{{Symbol::Input, Symbol::OpenPar}, {Symbol::Expr, Symbol::Semicolon, Symbol::InputP}},
{{Symbol::Input, Symbol::Ident}, {Symbol::Expr, Symbol::Semicolon, Symbol::InputP}},
{{Symbol::Input, Symbol::Number}, {Symbol::Expr, Symbol::Semicolon, Symbol::InputP}}
};
我想在使用地图的 find()
功能时单独访问列表中的每个值。
这是我想出的,但我无法获得对该索引值的引用:
if (parseTable.find(std::pair(stack_symbol.top(), current_symbol)))
std::map::find
将 return 指向已找到元素的迭代器,如果未找到则指向 end
。该迭代器将指向 std::pair<const Key, Value>
,在您的情况下将转换为
std::pair< const std::pair<Symbol, Symbol>, list<Symbol> >
你想要的是这样的
auto it = parseTable.find(std::pair(stack_symbol.top(), current_symbol));
if (it != parseTable.end()) { // A match was found
//it->first is std::pair<Symbol, Symbol>
//it->second is list<Symbol>
for (auto& symbol : it->second) {
//symbol is each individual value in the list
... do something with symbol
}
}
这不是地图键的最佳选择,它不会让地图得到有效利用。
std::map::find() return 指向找到搜索项的位置的迭代器,如果未找到,则 std::map::end()
。因此,在您的 if
语句中,您需要检查一下:
std::map<std::pair<Symbol, Symbol>, list<Symbol> >::iterator iter =
parseTable.find(std::pair(stack_symbol.top(), current_symbol)) //or auto with C++11
if (iter != parseTable.end())
find
returns 一个迭代器,用于访问对象(类型为 std::pair<std::pair<Symbol, Symbol>, list<Symbol>>
,您需要解引用运算符 *
Symbol currentSymbol = (*iter).first.second; //dummy example to show the use
std::list<Symbol> myList = (*iter).second'