C++ 如何修复此排序函数以对struct中的两个字段进行排序

C++ 如何修复此排序函数以对struct中的两个字段进行排序,c++,sorting,C++,Sorting,我试图用整数和std::字段对结构进行排序。主排序“字段”应为整数字段(无符号),但其中整数字段与字符串的排序相同 使用我的sortfunc,见下文,我得到一个断言 我该如何解决这个问题 调试断言失败!文件:agorithm第3128行表达式运算符b.n){ 返回true; } 否则{ 返回a.s.compare(b.s)b.n; } 无效排序列表(标准::向量和向量){ 排序(vec.begin()、vec.end()、sortfunc_nocrash); } 无效打印名(常量名称和mp){

我试图用整数和std::字段对结构进行排序。主排序“字段”应为整数字段(无符号),但其中整数字段与字符串的排序相同

使用我的sortfunc,见下文,我得到一个断言

我该如何解决这个问题

调试断言失败!文件:agorithm第3128行表达式运算符<

问题行是如果算法文件中的空(_DEBUG_LT_PRED(_PRED,_Val,*_First))插入排序1(_BidIt _First,_BidIt _Last,_Pr _PRED,_Ty*)

使用sortfunc\u nocrash的输出

unsorted list
1 Apples
1 Pears
4 Pineapples
1 Apricot
2 Mango
3 Banana
sorted list
4 Pineapples
3 Banana
2 Mango
1 Apples
1 Pears
1 Apricot
我需要1个梨作为上面排序列表中最后打印的项目

代码如下:

#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>


struct names {
    unsigned n;
    std::string s;
};

bool sortfunc(names a, names b) {
    if(a.n > b.n) {
        return true;
    }
    else {
        return a.s.compare(b.s) < 0;  
    }
}

//This one works but I if n same want to sort on string
bool sortfunc_nocrash(names a, names b) {
    return a.n > b.n;
}

void sortlist(std::vector<names>& vec) {
 std::sort(vec.begin(), vec.end(), sortfunc_nocrash);
}

void printme(const names& mp) {
    std::cout << mp.n << " " << mp.s << std::endl;
}

int main() {

    names mp[] = { {1,"Apples"}, {1,"Pears"}, {4,"Pineapples"}, {1,"Apricot"}, {2,"Mango"}, {3,"Banana"}};
    size_t sz = sizeof(mp) / sizeof(mp[0]);
    std::vector<names> vec(mp, mp+sz);

    std::cout << "unsorted list\n";
    for_each(vec.begin(), vec.end(), printme);
    sortlist(vec);

    std::cout << "sorted list\n";
    for_each(vec.begin(), vec.end(), printme);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
结构名称{
无符号n;
std::字符串s;
};
bool sortfunc(名称a、名称b){
如果(a.n>b.n){
返回true;
}
否则{
返回a.s.compare(b.s)<0;
}
}
//这一个可以工作,但我想按字符串排序
布勒·索特芬奇·诺克拉斯(姓名a、姓名b){
返回a.n>b.n;
}
无效排序列表(标准::向量和向量){
排序(vec.begin()、vec.end()、sortfunc_nocrash);
}
无效打印名(常量名称和mp){
std::不能像这样

bool sortfunc(names a, names b) {
    if (a.n > b.n) {
        return true;
    }
    else if (a.n == b.n) {
        return a.s.compare(b.s) < 0;  
    }
    else {
        return false;
    }
}
bool sortfunc(名称a、名称b){
如果(a.n>b.n){
返回true;
}
否则如果(a.n==b.n){
返回a.s.compare(b.s)<0;
}
否则{
返回false;
}
}

只有当数字相等时,才应比较字符串。实际上,您在问题中这样说,但代码与您所说的不匹配。

bool-sortfunc(names a,names b)
您应将它们作为常量引用传递:
bool-sortfunc(const-names&a,const-names&b)
或更短:
如果(a.n==b.n)返回a.s.compare(b.s)<0;else返回a.n>b.n;
。实际上,我更喜欢使用条件运算符在一个
return
语句中返回整个语句,但OP的代码也是如此。您介意解释一下逻辑吗?或者a可能给出一个链接。@user619818说
name1={3,“Banana”
name2={1,“Apples”}
。在您的代码中,
sortfunc(name1,name2)
是真的,
sortfunc(name2,name1)
也是真的。毫不奇怪,排序工作很难。在我的版本中,
sortfunc(name1,name2)
是真的,但
sortfunc(name2,name1)
是错误的,这是应该的。好的,我应该更仔细地考虑各种可能性
bool sortfunc(names a, names b) {
    if (a.n > b.n) {
        return true;
    }
    else if (a.n == b.n) {
        return a.s.compare(b.s) < 0;  
    }
    else {
        return false;
    }
}