C++ 如何按第二个元素对地图进行排序?
我有一张地图C++ 如何按第二个元素对地图进行排序?,c++,sorting,dictionary,vector,C++,Sorting,Dictionary,Vector,我有一张地图mapm我想按内部映射的第二个元素排序,即按map的int值降序排序 template <typename T1, typename T2> struct less_second { typedef pair<T1, T2> type; bool operator ()(type const& a, type const& b) const { return a.seco
mapm代码>我想按内部映射的第二个元素排序,即按map
的int值降序排序
template <typename T1, typename T2>
struct less_second {
typedef pair<T1, T2> type;
bool operator ()(type const& a, type const& b) const {
return a.second < b.second;
}
};
map<string, int> mymap;
// …
vector<pair<string, int> > mapcopy(mymap.begin(), mymap.end());
sort(mapcopy.begin(), mapcopy.end(), less_second<string, int>());
{12 {B 3}
{C 1}},
{6 {C 2}},
{3 {A 1}
{D 2}},
{9 {A 1}
{B 2}}
我用它来对地图的第二个元素进行排序,但这里我想按降序对内部地图的第二个元素进行排序
template <typename T1, typename T2>
struct less_second {
typedef pair<T1, T2> type;
bool operator ()(type const& a, type const& b) const {
return a.second < b.second;
}
};
map<string, int> mymap;
// …
vector<pair<string, int> > mapcopy(mymap.begin(), mymap.end());
sort(mapcopy.begin(), mapcopy.end(), less_second<string, int>());
{12 {B 3}
{C 1}},
{6 {C 2}},
{3 {A 1}
{D 2}},
{9 {A 1}
{B 2}}
然后,它应该按照内部映射的第二个元素按降序排序
template <typename T1, typename T2>
struct less_second {
typedef pair<T1, T2> type;
bool operator ()(type const& a, type const& b) const {
return a.second < b.second;
}
};
map<string, int> mymap;
// …
vector<pair<string, int> > mapcopy(mymap.begin(), mymap.end());
sort(mapcopy.begin(), mapcopy.end(), less_second<string, int>());
{12 {B 3}
{C 1}},
{6 {C 2}},
{3 {A 1}
{D 2}},
{9 {A 1}
{B 2}}
这将映射的元素
复制到向量
中,并根据映射中第一个元素的值对向量进行排序
#include <numeric>
#include <iostream>
#include <map>
#include <string>
#include <vector>
using std::cout;
using std::pair;
using std::string;
using std::vector;
using namespace std::literals::string_literals;
auto f1(const std::map<char, int> &m) {
return std::accumulate(
std::next(std::begin(m)),
std::end(m),
std::begin(m)->first + ": "s + std::to_string(std::begin(m)->second),
[](const auto &lhs, const auto &rhs) {
return lhs + ", "s + rhs.first + ": "s + std::to_string(rhs.second);
});
}
auto &operator<<(std::ostream &os, const std::vector<std::pair<int, std::map<char, int>>> &m) {
return os << "{\n"
<< std::accumulate(
std::next(std::begin(m)),
std::end(m),
std::to_string(std::begin(m)->first) + ": { "s + f1(std::begin(m)->second) + " }"s,
[](const auto &lhs, const auto &rhs) {
return lhs + ",\n"s + std::to_string(rhs.first) + ": { "s + f1(rhs.second) + " }"s;
})
<< "\n}\n";
}
int main() {
std::map<int, std::map<char, int>> mymap{ {3, {{'A', 1}, {'D', 2}}}, {6, {{'C', 2}}}, {9, {{'A', 1}, {'B', 2}}}, {12, {{'B', 3}, {'C', 1}}} };
std::vector<std::pair<int, std::map<char, int>>> mapcopy(mymap.begin(), mymap.end());
sort(mapcopy.begin(), mapcopy.end(), [](const auto &lhs, const auto &rhs){
return lhs.second.cbegin()->second > rhs.second.cbegin()->second;
});
std::cout << mapcopy;
}
我还不完全清楚。您能提供示例数据和预期结果吗?您要对一个容器或多个容器进行排序。您想根据内部容器中元素的属性对外部容器进行排序吗?@ThomasSablik我添加了一些示例来说明这一点