使用 std::map 和 std::p air 作为键,并将列表作为值
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
将迭代器返回到找到的元素,如果未找到,则返回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'
相关文章:
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 将std ::列表附加到std ::列表的向量中
- STD ::列表对其分配器参数有什么作用
- swig-包装到c#时,没有默认的std ::列表,我该怎么做
- 调用具有std ::列表为参数的C 函数
- STD ::列表和垃圾收集算法
- 低于20亿的质量 - 使用STD ::列表阻碍性能
- C 按其值对object的std ::列表进行排序
- 如何在(C )构造函数参数列表中包含std:列表
- 如何使用迭代器插入std ::列表
- C STD ::列表分割故障
- 将带有指针的 STD 列表复制到另一个带有指针的 STD 列表
- 比较std::对的2个std::列表
- 在 std 列表中查找对象并将其添加到另一个列表
- 与内存堆有关的C 链接列表(STD ::列表)是否使用新的
- 使用STD ::列表作为循环列表安全吗?
- C++当类型T需要构造函数时,是否可以创建类型T的std::列表
- 从对象指针的 STD 列表中擦除对象
- 如何从std::列表中删除项目
- 正在从std::unique_pointer的std::列表中删除元素