如何在多图中对键和值进行排序?

时间:2014-01-19 09:46:12

标签: c++ sorting stl maps

建议为密钥及其值排序多图的任何方法。例如- 输入 - (5,1),(1,9),(1,1),(5,2),(1,2) 输出必须是 - (1,1),(1,2),(1,9),(5,1),(5,2)。

4 个答案:

答案 0 :(得分:1)

如果你真的想使用multimap,那么值的排序总是你插入它们的顺序,并且不可能不幸地改变,即在问题中给出的例子中它们被存储为(1,9),(1) ,1),(1,2),(5,1),(5,2)

如果你可以在multimap上放松一下,那么你可以使用一个集合并将上面的对存储在集合中,并在对定义上定义你想要的顺序。因为,集合按排序顺序存储它的值,它也会按照您定义的顺序存储您的对。

答案 1 :(得分:1)

您只需要将其所有元素复制到multiset<pair<int, int>>

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<pair<int, int>> b就是您想要的,即{(1,1), (1,2), (1,9), (5,1), (5,2)}

答案 2 :(得分: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)
}

答案 3 :(得分:0)

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

完成此操作后,您可以使用multiset而不是multimap。