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

时间:2013-09-21 15:31:58

标签: c++ sorting

我正在尝试使用整数和std :: field对结构进行排序。主要排序“字段”应该是整数字段(无符号),但整数字段在字符串上的排序相同。

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

我该如何解决这个问题?

调试断言失败! file:agorithm line 3128表达式运算符<

问题行是if(_DEBUG_LT_PRED(_Pred,_Val,* _First))在算法文件中的void _Insertion_sort1(_BidIt _First,_BidIt _Last,_Pr _Pred,_Ty *)中。

使用sortfunc_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 Pears作为上面排序列表中的最后一个打印项目。

以下是代码:

#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;
}

更新:

感谢您的反馈,现在可行了:

bool sortfunc(const names& a, const names& b) {
    return a.n == b.n ? a.s.compare(b.s) < 0 : a.n > b.n;
}

但我真的很感激解释创建排序谓词的规则的链接。

1 个答案:

答案 0 :(得分:1)

喜欢这个

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;
    }
}

如果数字相等,您应该只比较字符串。你实际上在你的问题中这样说,但代码与你说的不符。