1

ここにある自己定義の比較ルールを使用して、それほど小さくない文字列のベクトルをソートしようとしています:

  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 ソートを使用すると、そうはなりません。

そのため、リークがどこにあるのかわかりません。ここで何らかのヒントを期待しています。

4

1 に答える 1

3

厳密に弱い順序が必要です。等しい文字列で呼び出された場合、順序付けのための関数はfalseを返す必要があります。と比較すると<=、動作しません。ところで:いくつかの標準ライブラリの実装には、このエラーを検出できた可能性のある診断モードがあると思います。これを使用してください。C++には十分な数のロープがあり、足で自分を撃つことができます。

于 2013-01-13T18:41:44.040 に答える