使用 std::map 和 std::p air 作为键,并将列表作为值

Using std::map with std::pair as a key and list as value

本文关键字:std 列表 air 使用 map      更新时间:2023-10-16

所以我有以下地图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将迭代器返回到找到的元素,如果未找到,则返回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(( 将迭代器返回到它找到搜索项的位置,如果未找到,则返回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返回一个迭代器,要访问对象(类型为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'