带有额外参数'invalid operator<'的c ++ STL排序

时间:2013-01-13 18:25:32

标签: c++ sorting stl

我正在尝试使用自定义比较规则对字符串进行排序:

  bool lexGraph(string const &str1, string const &str2)
{
    string::const_iterator i1 = str1.begin(), i2 = str2.begin();

    while((i1 < str1.end()) && (i2 < str2.end()))
    {
        if(*i1 == ' ')
        {
            i1++;
            continue;
        }
        if(*i2 == ' ')
        {
            i2++;
            continue;
        }
        if(toupper(*i1) < toupper(*i2))
        {
            return true;
        }
        if(toupper(*i1) > toupper(*i2))
        {
            return false;
        }
        i1++, i2++;
    }
    return (str1.length() <= str2.length());
}

我在这个循环中使用它:

vector<string> subset;
    ifstream fin(input);
    ofstream fout(output);
    string buff;
    for(long i = 0; i < 241; i++) 
    {
        getline(fin,buff);
        buff += '\n';
        subset.push_back(buff);

    }
sort(subset.begin(), subset.end(),lexGraph);

我发现大于240的向量会发生溢出错误。我发现如果使用较小的文件,这个数字甚至会变小。而且,字符串永远不会很大。如果我将我的功能缩减到

bool lexGraph(string const &str1, string const &str2)
{
    return (str1.length() <= str2.length());
}

错误仍然存​​在。但是当我在没有额外参数的情况下使用STL排序时它没有。

所以,我无法确定泄漏的位置,我希望在这里有一些提示。

1 个答案:

答案 0 :(得分:3)

你需要一个严格弱的订单。当使用相等的字符串调用时,您的排序函数必须返回false。如果您与<=进行比较,则无效。顺便说一句:我相信某些标准库实现有一种诊断模式,可能会为您捕获此错误。使用它,因为C ++中有足够的绳索,你可以用脚射击自己。