自定义字符串排序比较函数奇怪的行为

时间:2017-12-06 07:25:53

标签: c++ sorting

我需要对一个字符串向量进行排序,但它不是一个前沿排序。我编写了一个自定义排序函数,它适用于较小的矢量大小(< 100元素),但是我会得到更大尺寸的奇怪行为。注意:输入的值都是数字。

我添加了一些调试printf语句来查看内部发生了什么,我发现空字符串和其他奇怪的字符串被传递到要排序的函数中。

我的期望是只有向量中的值才会传递给函数。我确认向量中已填充了已知值。

排序功能:

bool sortFunc( string a, string b ){    
    printf( "a: %s,\tb: %s  \t", a.c_str(), b.c_str() );

    //sorting magic defining 'bool retVal'

    printf( "%s goes before %s\n", retVal?a.c_str():b.c_str(), retVal?b.c_str():a.c_str() );

    return retVal;
}

主要功能:

vector<string> a(n);
for( int i=0; i<n; ++i ){
    cin >> a[i];
}

sort(a.begin(),a.end(),sortFunc);

奇怪的输出样本:

a: 2,   b: 10   2 goes before 10
a: 10,  b: 10   10 goes before 10
a: ,    b: 10    goes before 10
a: ,    b: 10    goes before 10
a: \240E,   b: 10   \240E goes before 10
a: ,    b: 10    goes before 10
a: {@,  b: 10   {@ goes before 10
a: ,    b: 10    goes before 10
a: ,    b: 10    goes before 10
a: ,    b: 10    goes before 10
a: \225E,   b: 10   10 goes before \225E
a: 2,   b: 10   2 goes before 10
a: 10,  b: \225E    10 goes before \225E
a: ,    b:       goes before 
a: ,    b:       goes before 
a: \245E,   b:       goes before \245E
a: \236E,   b: \245E    \245E goes before \236E
a: 0G\260\377, b: \236E    0G\260\377 goes before \236E
a: 0G\260\377, b: \245E    0G\260\377 goes before \245E
a: 0G\260\377, b:      0G\260\377 goes before 

1 个答案:

答案 0 :(得分:2)

std::sort行为有趣时,它几乎总是因为无效的比较功能。您传递给std::sort的比较函数必须提供严格弱排序。通常的失败是定义了比较函数,以便对于两个对象abcompare(a,b)返回true compare(b,a)返回true,即a出现在b之前,而b出现在a之前。当发生这种情况时,排序算法可能会在数据结束时运行并做各种疯狂和疯狂的事情。

这个问题的实际答案在于:

//sorting magic defining 'bool retVal'