cpp vector sort runtime error

时间:2016-03-02 04:29:52

标签: c++ sorting

#include <stdio.h>
#include <algorithm>
#include <string>
#include <vector>
#include <iostream>

using namespace std;
int max(int a, int b) {
    return a < b ? b : a;
}
bool comp(const string &l, const string &r) {
    for (int i = 0; i < max(l.length(), r.length()); i++) {
        if (i >= l.length()) return false;
        if (i >= r.length()) return true;
        if (l[i] < r[i]) return l[i] < r[i];
    }
    return true;
}

int main(void) {
    int N; scanf("%d", &N);
    vector<string> v;
    for (int i = 0; i < N; i++) {
        string s; cin >> s;
        v.push_back(s);
    }
    sort(v.begin(), v.end(), comp);
    for (const string& s : v) {
        cout << s;
    }
    cout << endl;
}

在昨天举行的第9轮教育代码指令中,我无法使用带有用户定义函数的排序来解决问题http://codeforces.com/contest/632/problem/C

我使用了包含字符串的stl向量,它似乎适用于某些测试用例,但它在下面的测试用例中出现运行时错误。

100 abccaacaacacabbbcbbabcccccacabbaccbcacabcbbbaca bbbaccbbccbbbcacaabbcccaabcbbcbbbacaacabc cccabccaaabcaccabccbcccbbaacaaccbb cccabccaaabcaccabccbcccbbaacaaccbbcb cccabccaaabcaccabccbcccbbaacaaccbb cccabccaaabcaccabccbcccbbaacaaccbbbcca abbbcbbbbbbcccccbcbbb bbbaccbbccbbbcacaabbcccaabcbbcbbbacaacabcb abbcacbcabacccbcbabaabcaabcabacbbbbbca cccabccaaabcaccabccbcccbbaacaaccbbcaa cbcbbaccacbcababbccaacabacbcabbaccbcbcbcabbc acbbbbbbbcabbcbcaccccbcbaacccaccabcbaac bacccabacbbaaa

由于代码强制的策略,我无法查看完整的测试输入。我如何打败这种情况?

2 个答案:

答案 0 :(得分:2)

您的comp()谓词并未处理l[i] > r[i]的情况。所以当比较&#34; foo&#34;时它返回1和&#34; boo&#34;,并在比较&#34; boo&#34;时返回1和&#34; foo&#34;。因此,它无法实现严格的弱排序(即,行为不像<=),并且将其传递给std::sort()的结果未定义。

答案 1 :(得分:1)

尝试使用标准比较方法(不是您自己的bool comp(const string &l, const string &r)),例如:

#include <algorithm>
#include <string>
#include <vector>
#include <iostream>
#include <functional>

using namespace std;

int main(void) {
    int N; 
    cin >> N;
    vector<string> v;
    for (int i = 0; i < N; i++) {
        string s; 
        cin >> s;
        v.push_back(s);
    }
    std::sort (v.begin(), v.end(), std::greater<string>());
                                // or   std::less<string>()
    for (const string& s : v) {
        cout << s << endl;
    }
    cout << endl;
}

或者将您的功能更改为简单功能,例如:

bool comp(const string &l, const string &r) {
    return l < r;
}

<强>更新

但是如果你真的想使用你自己的comp函数,你应该理解异常invalid operator <出现的原因,因为你的比较函数(comp)返回true时两个相关字段都相等(sort所需的“小于”的行为不正确。)

最后,小提示(这不是一个解决方案) - 试试这个代码:

bool comp(const string &l, const string &r) {
    for (int i = 0; i < max(l.length(), r.length()); i++) {
        if (i >= l.length()) return false;
        if (i >= r.length()) return true;
        if (l[i] != r[i]) return l[i] < r[i];
    }
    return true;
}