在 C++ 中搜索嵌套多图的值?

Searching a Nested multimap for values in C++?

我正在尝试搜索一个嵌套的 MultiMap,其中外部 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")));

我试图让它成为一个交互式的、可搜索的 map/dictionary 这样如果我输入 "book" 它会输出关键字 "book" 以及动词定义和名词定义:

输出:

book [名词]: 这是book名词定义

book [verb]: This is the book verb definition

到目前为止,我已尝试在多重映射 class 中使用迭代器和 .equals_range() 方法,如果我使用“noun,它会起作用“作为我的第二个搜索参数,但如果我搜索 verb,则什么也没有显示。

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")));

对于这些复杂的数据结构,您只需仔细考虑每个元素的类型 returns 以及如何进一步引用该类型。开始时这是一个精神挑战,但随着练习会变得更容易。

我想也许这就是您所追求的:

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 可以通过使用基于范围的 for 循环进行迭代,如图所示。