Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 排序-给定一个自定义排序函数,是否可以在一个比较中进行多个排序查询?_C++_Algorithm_Sorting_C++11 - Fatal编程技术网

C++ 排序-给定一个自定义排序函数,是否可以在一个比较中进行多个排序查询?

C++ 排序-给定一个自定义排序函数,是否可以在一个比较中进行多个排序查询?,c++,algorithm,sorting,c++11,C++,Algorithm,Sorting,C++11,给定一个std::vector的Custom对象,我想根据多个查询对该列表进行排序(首先对value1进行排序,然后对value2进行排序),因此: 这是可行的,但显然效率较低,因为我必须遍历整个向量n次,而n等于我要执行的排序查询数 是否有一些高级逻辑技巧仍然可以做到这一点,或者在一个比较运算符中对多个属性进行排序根本不可能?如果您只需要字典排序,将帮助您: bool customSort(const Custom &a, const Custom &b) { retu

给定一个
std::vector
Custom
对象,我想根据多个查询对该列表进行排序(首先对
value1
进行排序,然后对
value2
进行排序),因此:

这是可行的,但显然效率较低,因为我必须遍历整个向量
n
次,而
n
等于我要执行的排序查询数


是否有一些高级逻辑技巧仍然可以做到这一点,或者在一个比较运算符中对多个属性进行排序根本不可能?

如果您只需要字典排序,将帮助您:

bool customSort(const Custom &a, const Custom &b)
{
    return std::tie(a.value1, a.value2) < std::tie(b.value1, b.value2);
}
bool customSort(常数自定义&a、常数自定义&b)
{
返回std::tie(a.value1,a.value2)
如果您只需要词典排序,将帮助您:

bool customSort(const Custom &a, const Custom &b)
{
    return std::tie(a.value1, a.value2) < std::tie(b.value1, b.value2);
}
bool customSort(常数自定义&a、常数自定义&b)
{
返回std::tie(a.value1,a.value2)
运算符的可能重复<和严格弱排序它甚至不一定会工作,因为
std::sort
是不稳定的。你需要
std::stable_sort
否则你的第一次排序可能是无用的;一直都是这样。您只需要正确地编写比较器。尽管他们的答案并没有真正解释原因,但ComicSanss已经明白了。有趣的是,我不知道std::stable\u sort,谢谢!
std::tie
路线通常是最好的解决方案,但是
LogicStuff
建议的副本值得一读<代码>a1完全不正确。考虑一下如何比较<代码> 15 <代码>和<代码> 23 <代码>。你不会对自己说“如果一小于二,五小于三,那么15小于23”,对吗?(答案是“假”,不是吗?)只有当
a1==b1
时,才进入第二步。这通常写为
a1
,以避免使用多个比较运算符(如果它被一个函子替换)。运算符<和严格弱排序的可能重复甚至不一定有效,因为
std::sort
是不稳定的。你需要
std::stable_sort
否则你的第一次排序可能是无用的;一直都是这样。您只需要正确地编写比较器。尽管他们的答案并没有真正解释原因,但ComicSanss已经明白了。有趣的是,我不知道std::stable\u sort,谢谢!
std::tie
路线通常是最好的解决方案,但是
LogicStuff
建议的副本值得一读<代码>a1完全不正确。考虑一下如何比较<代码> 15 <代码>和<代码> 23 <代码>。你不会对自己说“如果一小于二,五小于三,那么15小于23”,对吗?(答案是“假”,不是吗?)只有当
a1==b1
时,才进入第二步。这通常写为
a1
,以避免使用多个比较运算符(以防它被函子替换)。我会干燥并将领带放入lambda中<代码>自动mytie=[](const Custom&x){return std::tie(x.value1,x.value2);}然后
我的领带(a)我会把领带晾干,然后放进一个小瓶子里<代码>自动mytie=[](const Custom&x){return std::tie(x.value1,x.value2);}然后<代码>mytie(a)
bool customSort(const Custom &a, const Custom &b)
{
    return std::tie(a.value1, a.value2) < std::tie(b.value1, b.value2);
}