【问题标题】:If i have a nested map as a value to a multimap how can i insert values into the inner map?如果我有一个嵌套映射作为多映射的值,我如何将值插入内部映射?
【发布时间】:2018-10-20 12:06:06
【问题描述】:

我正在尝试实现一个字典,其中我有一个外部映射(作为多映射),键是要搜索的单词,值是内部映射,它本身将有几对具有不同的值,它们都可以映射到外部多映射键。

例如:Distinct这个词有多种含义,具体取决于它是名词、动词、形容词还是代词==> 名词-此程序中的关键字 副词- 独一无二。写得“明显”等等。

我正在考虑将单词 Distinct 作为 key 映射到外部多重映射,并将词性映射为内部映射的键,定义为内部地图的值。

到目前为止,我将多重映射声明为:

typedef map<string, string> valMap;

multimap<string,valMap> myMultMap;

我尝试使用 insert() 来添加值,如下所示:

myMultMap.insert("Diction", valMap.insert(pair<string,string>("fun", "first Value"));

我只是在学习地图,但仍然不确定地图中迭代器的内部工作原理。任何帮助将不胜感激。

【问题讨论】:

  • 或者可以考虑使用 `map, string> 代替。这样,您就有了一个组合键而不是嵌套映射。它使一些操作更容易,而另一些则更难。这实际上取决于数据的使用方式。在生产代码中,我可能会将这些细节隐藏在一个(或两个)类中

标签: c++ c++11 dictionary multimap


【解决方案1】:

首先,创建内部映射并将其存储到变量中。然后使用insert将其添加到外层地图中。

【讨论】:

  • 你的意思是像' myMultMap.insert(pair>("Distinct", 不确定如何在此处插入)); '?感谢您的快速回复!
【解决方案2】:

所以首先创建你需要插入的变量:

valMap tmp;
tmp.insert(make_pair("fun", "first Value"));

然后将这个tmp插入主地图:

myMultMap.insert(make_pair("Diction", move(tmp)));

【讨论】:

  • 哇,非常感谢!如果我没有使用 typedef map valMap;但只是声明了 valMap 我怎么能做到这一点?还是我必须使用 typedef 来做到这一点?所以要求清楚。我猜要访问它我需要迭代内部映射然后循环外部映射?
  • 很明显,如果没有 typedef,你会写 map&lt;string, string&gt; tmp 并且其余代码不会改变。
  • 我只是使用 typedef,因为它很简单,并且可以确保它与我们放入 multimap 中的类型相同。
【解决方案3】:

multimap::insert 将迭代器返回到存储的条目。您可以使用此迭代器将项目插入到插入的地图中,而无需创建任何临时变量。直接使用emplace 将参数转发到入口构造函数而不是insert 以避免创建临时对象也是一个好主意:

using t_Map = ::std::map<::std::string, ::std::string>;
using t_Multimap = ::std::multimap<::std::string, t_Map>;
t_Multimap multimap{};
auto const p_entry
{
    multimap.emplace
    (
        ::std::piecewise_construct
    ,   ::std::forward_as_tuple("Diction")
    ,   ::std::forward_as_tuple()
    )
};
auto & map{p_entry->second};
map.emplace
(
    ::std::piecewise_construct
,   ::std::forward_as_tuple("fun")
,   ::std::forward_as_tuple("first Value")
);

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2019-11-12
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多