【问题标题】:How to fix this sorting function to sort on two fields in struct如何修复此排序功能以对结构中的两个字段进行排序
【发布时间】:2013-09-21 15:31:57
【问题描述】:

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

使用我的 sortfunc,如下所示,我得到一个断言。

我该如何解决这个问题?

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

问题是 if (_DEBUG_LT_PRED(_Pred, _Val, *_First)) in 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 个梨作为上面排序列表中的最后一个打印项目。

代码如下:

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

但我非常感谢一个解释创建排序谓词的规则的链接。

【问题讨论】:

  • bool sortfunc(names a, names b) 你应该将它们作为常量引用传递:bool sortfunc(const names&amp; a, const names&amp; b)

标签: c++ sorting


【解决方案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;
    }
}

您应该只在数字相等的情况下比较字符串。您实际上在您的问题中这么说,但代码与您所说的不符。

【讨论】:

  • 或者,更短的:if (a.n == b.n) return a.s.compare(b.s) &lt; 0; else return a.n &gt; b.n;。实际上我更喜欢使用条件运算符的 one return 语句中的整体,但同样适用于 OP 的代码。
  • 你介意解释一下逻辑还是给个链接。
  • @user619818 说name1 = { 3 , "Banana" }name2 = { 1, "Apples" }。在您的代码中,sortfunc(name1, name2) 为真,sortfunc(name2, name1) 也为真。毫不奇怪,你很难进行分类。在我的版本中,sortfunc(name1, name2) 是真的,但 sortfunc(name2, name1) 是假的,应该是这样。
  • 好的,我应该更仔细地考虑可能性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2021-05-16
  • 2019-05-21
相关资源
最近更新 更多