📜  在 C++ STL 中按值对 Map 进行排序

📅  最后修改于: 2021-10-27 07:12:10             🧑  作者: Mango

映射是关联容器,以映射方式存储元素。每个元素都有一个键值和一个映射值。没有两个映射值可以具有相同的键值。默认情况下,C++ 中的 Map 根据其键按递增顺序排序。以下是实现此目的的各种方法:

方法 1 – 使用对向量的想法是将映射中的所有内容复制到对应的对向量中,并使用下面给出的 lambda函数根据第二个值对对向量进行排序:

bool cmp(pair& a,
         pair& b)
{
    return a.second < b.second;
}

where T1 and T2
are the data-types 
that can be the 
same or different.

下面是上述方法的实现:

// C++ program for the above approach
  
#include 
using namespace std;
  
// Comparator function to sort pairs
// according to second value
bool cmp(pair& a,
         pair& b)
{
    return a.second < b.second;
}
  
// Function to sort the map according
// to value in a (key-value) pairs
void sort(map& M)
{
  
    // Declare vector of pairs
    vector > A;
  
    // Copy key-value pair from Map
    // to vector of pairs
    for (auto& it : M) {
        A.push_back(it);
    }
  
    // Sort using comparator function
    sort(A.begin(), A.end(), cmp);
  
    // Print the sorted value
    for (auto& it : A) {
  
        cout << it.first << ' '
             << it.second << endl;
    }
}
  
// Driver Code
int main()
{
  
    // Declare Map
    map M;
  
    // Given Map
    M = { { "GfG", 3 },
          { "To", 2 },
          { "Welcome", 1 } };
  
    // Function Call
    sort(M);
    return 0;
}
输出:
Welcome 1
To 2
GfG 3

方法 2 – 使用对集想法是将映射中的所有(键值)对插入到一组对中,该对集可以使用比较器函数构造,该函数根据第二个值对对进行排序。

下面是上述方法的实现:

// C++ program for the above approach
#include 
using namespace std;
  
// Comparison function for sorting the
// set by increasing order of its pair's
// second value
struct comp {
    template 
  
    // Comparator function
    bool operator()(const T& l,
                    const T& r) const
    {
        if (l.second != r.second) {
            return l.second < r.second;
        }
        return l.first < r.first;
    }
};
  
// Function to sort the map according
// to value in a (key-value) pairs
void sort(map& M)
{
  
    // Declare set of pairs and insert
    // pairs according to the comparator
    // function comp()
    set, comp> S(M.begin(),
                                   M.end());
  
    // Print the sorted value
    for (auto& it : S) {
        cout << it.first << ' '
             << it.second << endl;
    }
}
  
// Driver Code
int main()
{
  
    // Declare Map
    map M;
  
    // Given Map
    M = { { "GfG", 3 },
          { "To", 2 },
          { "Welcome", 1 } };
  
    // Function Call
    sort(M);
    return 0;
}
输出:
Welcome 1
To 2
GfG 3

方法 3 – 使用多图
Multimap 类似于地图,但附加的是多个元素可以具有相同的键。在这种情况下,键值和映射值对必须是唯一的,而不是每个元素都是唯一的。
这个想法是使用原始映射的值作为多映射中的键和原始映射键值作为多映射中的值,将给定映射中的所有对插入到多映射中。

下面是上述方法的实现:

// C++ program for the above approach
#include 
using namespace std;
  
// Function to sort the map according
// to value in a (key-value) pairs
void sort(map& M)
{
  
    // Declare a multimap
    multimap MM;
  
    // Insert every (key-value) pairs from
    // map M to multimap MM as (value-key)
    // pairs
    for (auto& it : M) {
        MM.insert({ it.second, it.first });
    }
  
    // Print the multimap
    for (auto& it : MM) {
        cout << it.second << ' '
             << it.first << endl;
    }
}
  
// Driver Code
int main()
{
  
    // Declare Map
    map M;
  
    // Given Map
    M = { { "GfG", 3 },
          { "To", 2 },
          { "Welcome", 1 } };
  
    // Function Call
    sort(M);
    return 0;
}
输出:
Welcome 1
To 2
GfG 3
想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解语言和 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程