C++ 如何对多重映射中的键和值进行排序?
建议对多重映射的键及其值进行排序的任何方法。比如说- 输入- (5,1), (1,9), (1,1), (5,2), (1,2) 输出必须是-C++ 如何对多重映射中的键和值进行排序?,c++,sorting,stl,maps,C++,Sorting,Stl,Maps,建议对多重映射的键及其值进行排序的任何方法。比如说- 输入- (5,1), (1,9), (1,1), (5,2), (1,2) 输出必须是- (1,1),(1,2),(1,9),(5,1),(5,2)。如果您真的想使用多重映射,那么值的顺序始终是您插入它们的顺序,并且很遗憾不能更改,即在问题中给出的示例中,它们存储为(1,9),(1,1),(1,2),(5,1),(5,2) 如果您可以在多重映射上放松一点,那么您可以使用一个集合并将上述对存储在集合中,并在对定义上定义您想要的顺序。由于集合按排
(1,1),(1,2),(1,9),(5,1),(5,2)。如果您真的想使用多重映射,那么值的顺序始终是您插入它们的顺序,并且很遗憾不能更改,即在问题中给出的示例中,它们存储为(1,9),(1,1),(1,2),(5,1),(5,2)
如果您可以在多重映射上放松一点,那么您可以使用一个集合并将上述对存储在集合中,并在对定义上定义您想要的顺序。由于集合按排序顺序存储其值,因此它也将按您定义的顺序存储您的对。如果您真的想使用多重映射,则值的顺序始终是您插入它们的顺序,不幸的是,不能更改,即在问题中给出的示例中,它们存储为(1,9)、(1,1)、(1,2),(5,1)、(5,2)
如果你可以在多重映射上放松一点,那么你可以使用一个集合,将上面的对存储在集合中,并在对定义中定义你想要的顺序。由于集合以排序的顺序存储它的值,它也会以你定义的顺序存储你的对。更改键以包含这两个值。设计一个比较器,它可以比较按正确顺序排列两对值
完成此操作后,您可以使用multiset而不是multimap。更改键以包含这两个值。设计一个比较器,以正确的顺序比较这两对值
完成此操作后,可以使用multiset而不是multimap。只需将其所有元素复制到
multiset
:
multimap a;
a、 插入(对(5,1));
a、 插入(第(1,9)对);
a、 插入(对(1,1));
a、 插入(对(5,2));
a、 插入(对(1,2));
多集b;
for(multimap::iterator i=a.begin();i!=a.end();i++)
b、 插入(成对((*i).first,(*i.second));
在此之后,
multiset b
就是您想要的,即{(1,1)、(1,2)、(1,9)、(5,1)、(5,2)}
您只需将其所有元素复制到multiset
:
multimap a;
a、 插入(对(5,1));
a、 插入(第(1,9)对);
a、 插入(对(1,1));
a、 插入(对(5,2));
a、 插入(对(1,2));
多集b;
for(multimap::iterator i=a.begin();i!=a.end();i++)
b、 插入(成对((*i).first,(*i.second));
在此之后,
multiset b
就是您想要的,即{(1,1)、(1,2)、(1,9)、(5,1)、(5,2)}
答案是emplace\u 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)
}
insert_with_提示(M mmap,K键,V值)
{
自动i1=mmap.equal_范围(键);
用于(自动i2=i1.first;i2!=i1.second;++i2)
{
如果(i2->second>Key){/答案是emplace\u 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)
}
insert_with_提示(M mmap,K键,V值)
{
自动i1=mmap.equal_范围(键);
用于(自动i2=i1.first;i2!=i1.second;++i2)
{
如果(i2->秒>键){//具有相同键的值的顺序是插入顺序。这是不可能更改的。将实体复制到std::multiset
std::map
可能是另一种选择。std::set
插入已排序的元素,您可以为更复杂的元素定义比较。具有相同键的值的顺序是插入顺序。这是不可能更改的。将实体复制到std::multiset
std::map
可能是一种替代方法。std::set
插入按顺序排列的元素,您可以为更复杂的元素定义比较。这是不正确的-插入到multimap的元素按使用的键排序元素的插入顺序并不影响它们的存储顺序。我的意思是,在多重映射中,这些对是按键的顺序存储的,但没有基于它们的值(如(键,值)对中的值)的正确顺序,即在问题中给出的示例中,它们存储为(1,9)、(1,1)、(1,2),(5,1),(5,2)。我想你误解了我的回答。这是不正确的-插入到多重映射中的元素按使用的键排序。插入元素的顺序并不影响它们的存储顺序。我的意思是,在多重映射中,成对的元素按键的顺序存储,但没有基于v的正确顺序值(如(键、值)对中的值),即在问题中给出的示例中,它们存储为(1,9)、(1,1)、(1,2)、(5,1)、(5,2)。我想你误解了我的回答。这应该是公认的答案。在创建std::multimap
时,我仍然不介意额外的努力。允许通过键和equal_range()
(因此std::set
或std::multiset
进行访问),同时在运行时对值进行更有效的比较。必须切换到g++4.8(4.7不提供emplace()
和emplace\u hint())
即使使用std=c++11
。这个答案非常有用。但是,它不应该将i2->second
与Value
相比,而不是Key
?此外,Key的大小写也会引起一些混乱。这应该是公认的答案。在创建t时,它帮助了我一个场景,我仍然不介意额外的努力他std::multimap
。允许通过键和equal_range()
进行访问(因此std::set
或std::multiset
不是替代方案),同时在运行时对值进行更有效的比较。不得不切换到g++4.8(4.7不提供emplace()
和emplace\u提示()
即使使用std=c++11
。这个答案非常有用。但是,它不应该将i2->second
与Value
进行比较,而不是将Key
进行比较吗?此外,Key的大小写也会引起一些混淆。