如何在原始地图中使用带反射的比较器对地图进行排序?

How to sort map using comparator with reflection in original map?

如何使用比较器对多图进行排序。 它应该反映在多图容器中


#include <bits/stdc++.h>
using namespace std;

// Comparator function to sort pairs
// according to second value
bool cmp(pair<string, int>& a,
        pair<string, int>& b)
{
    return a.second < b.second;
}

// Function to sort the map according
// to value in a (key-value) pairs
void sort(multimap<string, int>& M)
{

    // Declare vector of pairs
    vector<pair<string, int> > 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
    multimap<string, int> M;

    // Given Map
    M = { { "GfG", 3 },
        { "To", 2 },
        { "Welcome", 1 } };

    // Function Call
    sort(M);
  cout<<"\n";
  for(auto i:M)
  {
    cout<<i.first<<" "<<i.second<<endl;
  }
  
  return 0;
}

这是我从 Geekforgeeks 得到的代码! 我完全理解这个概念,但我需要知道如果地图是多地图,如何对地图本身进行排序。?

输出

欢迎 1
至 2
GFG 3

GFG 3
至 2
欢迎 1

基本上评论里已经给出答案了。我会再次总结并展示一个替代方案。

背景是我们经常要用到一个associative容器的属性,但后来又按它的[=51排序=]value 而不是 key.

未排序关联容器,如std::unsorted_setstd::unordered_mapstd::unordered_multisetstd::unordered_multimap 不能订购,正如他们的名字所说。他们使用 hash 算法来存储和检索它们的值。

另请阅读 CPP Reference 关于 STL 容器的内容。

而且,如果我们查看 排序关联 容器,我们会看到 std::setstd::multiset 不适用于键值对,另外两个 std::mapstd::multimap 有一个 keyvalue 但始终按其 key 排序。

但是如前所述,我们通常希望拥有 关联容器[=65] 的优势=]key - value 对,然后是一些按值排序的数据。

这只能通过使用 2 个具有所需 属性 的容器来实现。在上面的示例中,数据被复制到 std::vector 中,然后进行排序。通过添加 std::pair of keyvalue到一个容器。所以:

using Pair = std::pair<std::string, int>;
using Conatiner = std::vector<Pair>;

一个经常需要的用例是计数。例如,计算字符串中的字母。使用 std::mapstd::unordered_map 并使用第二个容器按 value 排序可以很容易地实现这一点。请参阅下面的一些示例代码:

#include <iostream>
#include <string>
#include <utility>
#include <set>
#include <unordered_map>
#include <type_traits>

// ------------------------------------------------------------
// Create aliases. Save typing work and make code more readable
using Pair = std::pair<char, unsigned int>;

// Standard approach for counter
using Counter = std::unordered_map<Pair::first_type, Pair::second_type>;

// Sorted values will be stored in a multiset, because their may be double ranks
struct Comp { bool operator ()(const Pair& p1, const Pair& p2) const { return (p1.second == p2.second) ? p1.first<p2.first : p1.second>p2.second; } };
using Rank = std::multiset<Pair, Comp>;
// ------------------------------------------------------------

// Function to get the rank of letters in a string
Rank getRank(const std::string& str) {

    Counter counter;
    for (const char c : str) counter[c]++;

    return { counter.begin(), counter.end() };
}

// Test / Driver Code
int main() {

    if (std::string userString{}; std::getline(std::cin, userString))

    for (const auto& [letter, count] : getRank(userString))
        std::cout << (int)letter << ' ' << count << ' ';
}

因此,我们使用 std::unordred map 的 属性 作为快速关联容器,不按键排序,结合 std::multiset 将充当“排序器” ".


或者,您可以从头开始 std::multiset。示例:

#include <iostream>
#include <string>
#include <utility>
#include <set>

// ------------------------------------------------------------
// Create aliases. Save typing work and make code more readable
using Pair = std::pair <std::string, int> ;

// Sorted values will be stored in a multiset
struct Comp { bool operator ()(const Pair& p1, const Pair& p2) const { return (p1.second == p2.second) ? p1.first<p2.first : p1.second<p2.second; } };
using Sorted = std::multiset<Pair, Comp>;
// ------------------------------------------------------------

// Driver Code
int main()
{
    Sorted data {  { "GfG", 3 }, { "To", 2 },  { "Welcome", 1 } };

    for (const auto& [key, value] : data)
        std::cout << key << '\t' << value << '\n';
}

当然完全取决于您想要实现的目标。 . .