📜  按C++ STL中的值对地图排序

📅  最后修改于: 2021-05-04 20:37:26             🧑  作者: 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 –使用多图
多重地图类似于地图,不同之处在于多个元素可以具有相同的键。在这种情况下,键值和映射值对必须是唯一的,而不是每个元素都是唯一的。
想法是将给定地图中的所有对都插入到多张地图中,使用原始地图的值作为多张地图中的键,并将原始地图的键值作为多张地图中的值。

下面是上述方法的实现:

// 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。