建议为密钥及其值排序多图的任何方法。例如- 输入 - (5,1),(1,9),(1,1),(5,2),(1,2) 输出必须是 - (1,1),(1,2),(1,9),(5,1),(5,2)。
答案 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。