【问题标题】:Inserting into a std::Multimap of std::Map (C++)插入 std::Map 的 std::Multimap (C++)
【发布时间】:2014-06-29 18:44:13
【问题描述】:

如果我有一个std::multimap<int, std::map<int, MyClass>> myMultimap,我如何将一个类对象MyClassA 插入到映射中,其值为1,多映射值2

看起来我可以在 c++11 中执行 myMultimap.at(2).insert(std::pair<1,MyClassA>);,但由于库回归/不可比性超出我的控制范围,我正在使用 c++98。

我也试过了

myMultimap[2].insert(
            std::make_pair(
                myMultimap[2].end(),
                myClassA
            )
        );

这给出了:error: no match for ‘operator[]’ (operand types are ‘std::multimap<int, std::map<int, ns_namespace::MyClassType> >’ and ‘int’)| 用于 [...]'s。

我不想做类似myMultimap.insert(std::make_pair(2,std::make_pair(1,MyClassA))) 这样的事情 因为如果我理解正确,这将在多图中创建一个新地图,而不是将类对象分配给多图中的现有地图。

【问题讨论】:

  • multimapat/[] 没有意义。想想看。好好想想吧。
  • 使用多重映射,您可以拥有多个键值为 2 的条目。其中哪一个具有您要在其中插入对象的映射?这就是问题——决定!
  • 我想这是有道理的。有没有办法做类似于 .at() 但使用迭代器的事情? (另外,我刚刚意识到 C++11 添加了 .at 到地图,而不是多地图,哎呀)
  • 比如.find(3)返回一个迭代器,然后用它来访问map?
  • 一张地图可能已经是错误的方向了! Tes,您可以使用这样的数据结构,但它们不太可能特别有用。我猜,由一对整数索引的地图更合适。

标签: c++ map stl insert


【解决方案1】:

这是一个两阶段的过程:

  1. 在外部地图中找到要对 inber 地图执行操作的位置。如有必要,插入一个新元素。
  2. 用适当的值更新内部地图。

我不知道为什么外部地图我们是多地图(它们很少有用)所以示例只使用第一个条目:

auto it = mymultimap.lower_bound(2);
if (it == mymultimap.end() || it->first != 2) {
    it = mymultimap.insert(
        std::make_pair(2, std::map<int, MyClass>())).first;
}
(*it)[1] = MyClassA;

(在移动设备上输入:可能有错别字,但总体方法应该可行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 2019-08-19
    • 1970-01-01
    • 2019-05-07
    • 2011-02-08
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多