Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何对多重映射中的键和值进行排序?_C++_Sorting_Stl_Maps - Fatal编程技术网

C++ 如何对多重映射中的键和值进行排序?

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) 如果您可以在多重映射上放松一点,那么您可以使用一个集合并将上述对存储在集合中,并在对定义上定义您想要的顺序。由于集合按排

建议对多重映射的键及其值进行排序的任何方法。比如说- 输入- (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,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的大小写也会引起一些混淆。