如何在原始地图中使用带反射的比较器对地图进行排序?
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_set
、std::unordered_map
、std::unordered_multiset
和std::unordered_multimap
不能订购,正如他们的名字所说。他们使用 hash 算法来存储和检索它们的值。
另请阅读 CPP Reference 关于 STL 容器的内容。
而且,如果我们查看 排序关联 容器,我们会看到 std::set
和 std::multiset
不适用于键值对,另外两个 std::map
和 std::multimap
有一个 key 和value 但始终按其 key 排序。
但是如前所述,我们通常希望拥有 关联容器 和 [=65] 的优势=]key - value 对,然后是一些按值排序的数据。
这只能通过使用 2 个具有所需 属性 的容器来实现。在上面的示例中,数据被复制到 std::vector
中,然后进行排序。通过添加 std::pair
of key 和 value到一个容器。所以:
using Pair = std::pair<std::string, int>;
using Conatiner = std::vector<Pair>;
一个经常需要的用例是计数。例如,计算字符串中的字母。使用 std::map
或 std::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';
}
当然完全取决于您想要实现的目标。 . .
如何使用比较器对多图进行排序。 它应该反映在多图容器中
#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_set
、std::unordered_map
、std::unordered_multiset
和std::unordered_multimap
不能订购,正如他们的名字所说。他们使用 hash 算法来存储和检索它们的值。
另请阅读 CPP Reference 关于 STL 容器的内容。
而且,如果我们查看 排序关联 容器,我们会看到 std::set
和 std::multiset
不适用于键值对,另外两个 std::map
和 std::multimap
有一个 key 和value 但始终按其 key 排序。
但是如前所述,我们通常希望拥有 关联容器 和 [=65] 的优势=]key - value 对,然后是一些按值排序的数据。
这只能通过使用 2 个具有所需 属性 的容器来实现。在上面的示例中,数据被复制到 std::vector
中,然后进行排序。通过添加 std::pair
of key 和 value到一个容器。所以:
using Pair = std::pair<std::string, int>;
using Conatiner = std::vector<Pair>;
一个经常需要的用例是计数。例如,计算字符串中的字母。使用 std::map
或 std::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';
}
当然完全取决于您想要实现的目标。 . .