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

标签 c++ sorting stl

我正在尝试使用此处自定义的比较规则对一个不太小的字符串 vector 进行排序:

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

我发现当 vector 大于 240 时会发生溢出错误。我发现如果我使用较小的文件,这个数字甚至会变得更小。此外,字符串永远不会很大。如果我将我的功能缩减为

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

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

所以,我不知道泄漏在哪里,我希望在这里得到一些提示。

最佳答案

您需要严格弱排序。当使用相同的字符串调用时,您的排序函数必须返回 false。如果与 <= 比较, 它不起作用。顺便说一句:我相信某些标准库实现具有诊断模式,可以为您捕获此错误。使用它,因为 C++ 中有足够多的绳索可以让你搬起石头砸自己的脚。

关于c++ STL sort 带有额外的参数 'invalid operator <',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306682/

相关文章:

c++ - 2个操作数的产品类型

algorithm - 如何在 Omega(nt+nlogn) 中对长度为 t 的 n 个字符串进行排序?

c++ - 键不存在时 unordered_multimap::bucket() 的返回值?

c++ - ( vector ?)析构函数中的读取访问冲突

c++ - 定长char数组用短字符串初始化时,剩余空间如何初始化?

C++,指向函数的指针作为新类型

algorithm - 合并排序比较

r - 如何在 R 中对向量进行排序,保留名称和值

c++ - 传递 `const` 作为参数时是否需要写 `const_iterator` 关键字?

c++ - 为什么我不能将函数指针作为模板参数传递给 map ?