我正在尝试使用整数和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;
}
但我真的很感激解释创建排序谓词的规则的链接。
答案 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;
}
}
如果数字相等,您应该只比较字符串。你实际上在你的问题中这样说,但代码与你说的不符。