【问题标题】:How to sort both key and value in a multimap?如何在多图中对键和值进行排序?
【发布时间】:2014-01-19 09:46:12
【问题描述】:

建议任何方法来对多图的键及其值进行排序。例如- 输入- (5,1), (1,9), (1,1), (5,2), (1,2) 并且输出必须是- (1,1), (1,2), (1,9), (5,1), (5,2)。

【问题讨论】:

  • 相同key的值的顺序就是插入的顺序。这是不可能改变的。
  • 将实体复制到std::multiset<std::pair<int,int>>
  • std::map<int, std::set<int> > 可能是另一种选择。 std::set 插入有序的元素,您可以为更复杂的元素定义比较。

标签: c++ sorting stl maps


【解决方案1】:

答案是emplace_hint。伪代码将如下所示:-

insert_with_hint(M mmap, K key, V Value)
{
    auto i1 = mmap.equal_range(Key);
    for (auto i2 = i1.first; i2 != i1.second; ++i2)
    {
     if (i2->second > Key) { // <-- Here add your sorting criteria
           mmap.emplace_hint(i2,Key,Value)
      return
     }
   }
   mmap.emplace(Key,Value)
}

【讨论】:

  • 应该是公认的答案。在创建std::multimap 时我仍然不介意额外努力的情况下帮助了我。允许通过 key 和 equal_range() 访问(因此 std::setstd::multiset 不是替代方案),同时在运行时对值进行更有效的比较。不得不切换到 g++ 4.8(4.7 不提供 emplace()emplace_hint(),即使是 std=c++11
  • 这个答案很有帮助。但是,它不应该将i2-&gt;secondValue 进行比较而不是Key 吗?此外,key 的大写也会引起一些混乱。
【解决方案2】:

您只需将其所有元素复制到multiset&lt;pair&lt;int, int&gt;&gt;

multimap<int, int> a;
a.insert(pair<int, int>(5, 1));
a.insert(pair<int, int>(1, 9));
a.insert(pair<int, int>(1, 1));
a.insert(pair<int, int>(5, 2));
a.insert(pair<int, int>(1, 2));

multiset<pair<int, int>> b;
for (multimap<int, int>::iterator i=a.begin(); i!=a.end(); i++)
    b.insert(pair<int, int>((*i).first, (*i).second));

在这之后,multiset&lt;pair&lt;int, int&gt;&gt; b 就是你想要的,即{(1,1), (1,2), (1,9), (5,1), (5,2)}

【讨论】:

    【解决方案3】:

    如果您真的想使用 multimap,那么值的顺序始终是您插入它们的顺序,不幸的是不能更改,即在问题中给出的示例中,它们存储为 (1,9), (1 ,1), (1,2), (5, 1), (5,2)

    如果您可以在多图上放松一点,那么您可以使用集合并将上述对存储在集合中,并在对定义中定义您想要的顺序。由于该集合按排序顺序存储它的值,因此它也会按照您定义的顺序存储您的配对。

    【讨论】:

    • 这是不正确的 - 插入到多重映射中的元素按使用的键排序。插入元素的顺序不会影响它们的存储顺序。
    • 我的意思是说,在多重映射中,这些对是按照它们的键的顺序存储的,但是根据它们的值没有正确的顺序(值在 (key, value) 对中) ) 即在问题给出的示例中,它们存储为 (1,9),(1,1),(1,2),(5,1),(5,2)。我想你误解了我的回答
    【解决方案4】:

    更改键以包含两个值。设计一个比较器,以正确的顺序比较两对值。

    完成此操作后,您可以使用多重集而不是多重映射。

    【讨论】:

      猜你喜欢
      • 2015-12-24
      • 2012-07-02
      • 2018-03-06
      • 2011-09-26
      • 1970-01-01
      • 2015-10-01
      • 2016-11-17
      • 1970-01-01
      • 2019-08-17
      相关资源
      最近更新 更多