Ищете вложенную мультикарту для значений в C ++? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь найти вложенную MultiMap, в которой внешняя Multimap имеет строковое значение ключа, а значением для каждого ключа является другая мультикарта, в которой строки в виде пар «ключ-значение» показаны следующим образом:

 multimap<string,map<string, string>> myMultMap;
myMultMap.insert(make_pair("distinct", makeMap("noun", "This is the first definition")));
myMultMap.insert(make_pair("distinct", makeMap("verb", "This is the second definition")));
myMultMap.insert(make_pair("distinct", makeMap("adjective", "This is the third definition")));
myMultMap.insert(make_pair("book", makeMap("noun", "This is the book noun definition")));
myMultMap.insert(make_pair("book", makeMap("verb", "This is the book verb definition")));
myMultMap.insert(make_pair("other", makeMap("noun", "This is the other noun definition")));
myMultMap.insert(make_pair("dumb", makeMap("noun", "This is the dumb noun definition")));

Я пытаюсь сделать его интерактивной, доступной для поиска картой / словарем, чтобы при вводе «книги» выводилось ключевое слово «книга», а также определение глагола и определение существительного:

Выход:

книга [существительное]: Это определение существительного книги

книга [глагол]: это определение глагола книги

До сих пор я пытался использовать итераторы и метод .equals_range () в классе multimap, и он работает, если я использую " существительное " в качестве второго параметра поиска, но если я ищу глагол ничего не появляется.

pair <multimap<string, string>::iterator, multimap<string, string>::iterator> ret;

auto iter = myMultMap.find(str)->second;
ret = iter.equal_range("noun");


for (multimap<string,string>::iterator it=ret.first; it!=ret.second; ++it) {
    std::cout << str << " =>";
    std::cout << ' ' << it->second;
}
std::cout << '\n';

Любая помощь будет принята с благодарностью.

редактировать

Я забыл добавить, что внешняя мультикарта также имеет несколько определений для каждой части речевого ключа. myMultMap.insert(make_pair("book", makeMap("noun", "This is the 1 definition"))); myMultMap.insert(make_pair("book", makeMap("verb", "This is the book verb def1"))); myMultMap.insert(make_pair("book", makeMap("verb", "This is the book verb def 2"))); myMultMap.insert(make_pair("book", makeMap("verb", "This is the book def 1"))); myMultMap.insert(make_pair("book", makeMap("noun", "This is the book noun def 2")));

1 Ответ

0 голосов
/ 02 ноября 2018

С этими сложными структурами данных вам просто нужно тщательно продумать, какой тип возвращает каждый элемент, и как в дальнейшем ссылаться на этот тип. Для начала это умственное испытание, но с практикой оно становится легче.

Я думаю, может быть что-то вроде того, что вы ищете:

void output(std::multimap<std::string, std::map<std::string, std::string>> mm, 
    std::string const& item)
{
    auto range = mm.equal_range(item);

    for(auto item_iter = range.first; item_iter != range.second; ++item_iter)
        for(auto const& entry: item_iter->second)
            std::cout << item_iter->first << " [" << entry.first << "]: " << entry.second << '\n';
}

Внешний слой - это std::multimap, который может иметь дубликаты ключей, поэтому equal_range - это обычный способ поиска по данному ключу.

Это дает вам список итераторов , так что вы проходите через них. Каждый разыменовывает к std::pair<std::string, std::map<std::string, std::string>.

Затем можно выполнить итерацию std::map, используя диапазон для цикла, как показано.

...