Использование std :: map с std :: pair в качестве ключа и list в качестве значения - PullRequest
0 голосов
/ 16 мая 2018

Итак, у меня есть следующая карта 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)))

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Это не лучший выбор для ключа карты, он не позволит эффективно использовать карту.

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'
0 голосов
/ 16 мая 2018

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
    }
}
...