我有以下结构
struct Mydate
{
int UserId;
string name;
};
vector<Mydate> v1;
1:按UserId对矢量进行排序
2:按名称对排序后的矢量进行排序,同时保持先前的顺序 例如
v1.push_back(make_pair(100, "d"));
v1.push_back(make_pair(100, "q"));
v1.push_back(make_pair(102, "m"));
v1.push_back(make_pair(102, "d"));
v1.push_back(make_pair(100, "c"));
(排序函数可以首先用于UserId,但是当我们按名称对它进行排序时,它会覆盖以前的顺序)
我们可以看到以下格式的输出:
(100,c) , (100, d), (100, q), (102,d), (102, m)
请有人帮助我吗?
答案 0 :(得分:4)
您可以像这样定义operator<
成员函数:
operator<(const Mydate & rhs)
{
if (UserId < rhs.UserId)
{
return true;
}
else if (UserId == rhs.UserId)
{
if (name < rhs.name)
{
return true;
}
}
return false;
}
答案 1 :(得分:3)
您可以为std::sort
vector<Mydate> v1;
// ...
std::sort(v1.begin(), v1.end(), [](Mydate const &a, Mydate const &b) {
return (a.UserId == b.UserId)? (a.name < b.name) : (a.UserId < b.UserId);});
或者您可以使用std::pair
using Mydate = std::pair<int, std::string>;
std::pair
按字典顺序进行比较,这是你想要的。然后使用std::sort
作为:
std::vector<Mydate> v1;
//...
std::sort(v1.begin(), v1.end());
答案 2 :(得分:3)
看来你的意思是以下
#include <iostream>
#include <string>
#include <vector>
#include <tuple>
#include <algorithm>
struct Mydate
{
int UserId;
std::string name;
};
std::vector<Mydate> v1;
int main()
{
v1.push_back( { 100, "d" } );
v1.push_back( { 100, "q" } );
v1.push_back( { 102, "m" } );
v1.push_back( { 102, "d" } );
v1.push_back( { 100, "c" } );
std::sort( v1.begin(), v1.end(),
[]( const Mydate &a, const Mydate &b )
{
return std::tie( a.UserId, a.name ) < std::tie( b.UserId, b.name );
} );
for ( const Mydate &item : v1 )
{
std::cout << item.UserId << '\t' << item.name << std::endl;
}
}
程序输出
100 c
100 d
100 q
102 d
102 m
答案 3 :(得分:2)
自定义比较器方法是首选方法,但为了完整起见,应提及多种分类方法。有时它可能是首选(通常当您希望能够动态选择排序规则时)。
要按某些属性A对条目进行排序,其中具有相同A的元素将按属性B排序,您需要使用自下而上的方法:先按B排序,然后按A排序,保留等效元素的相对顺序(稳定排序)。
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
struct Mydate
{
int UserId;
std::string name;
};
int main()
{
std::vector<Mydate> v {{100, "d"}, {100, "q"}, {102, "m"}, {102, "d"}, {100, "c"}};
std::sort(v.begin(), v.end(), [](auto& l, auto& r){return l.name < r.name;});
std::stable_sort(v.begin(), v.end(), [](auto& l, auto& r){return l.UserId < r.UserId;});
for(const auto& d: v)
std::cout << d.UserId << ' ' << d.name << '\n';
}