使用自定义比较器排序时运行时错误

Anm*_*ggi 2 c++ sorting runtime-error vector stdstring

我试图根据自定义比较器函数对字符串向量进行排序 - :

#include<bits/stdc++.h>
using namespace std;

template<typename T>
std::string ToString( const T& obj )
{
    std::stringstream ss;
    ss << obj;
    return ss.str();
}

bool comp( string num1, string num2 )
{
    bool swapped = false;

    if ( num2.size() > num1.size() )
    {
        swap( num1, num2 );
        swapped = true;
    }

    size_t i = 0;
    size_t j = 0;

    while ( i < num1.size() && j < num2.size() )
    {
        if ( num1[i] > num2[j] )
        {
            return !swapped;
        }
        else if ( num1[i] < num2[j] )
        {
            return swapped;
        }

        i++;
        j++;
    }

    j = 0;

    while ( i < num1.size() && j < num1.size() )
    {
        if ( num1[i] > num1[j] )
        {
            return !swapped;
        }
        else if ( num1[i] < num1[j] )
        {
            return swapped;
        }

        i++;
        j++;
    }

    return true;
}

string largestNumber( vector<int>& nums )
{
    vector<string> numsString( nums.size() );

    for ( size_t i = 0; i < numsString.size(); i++ )
    {
        numsString[i] = ToString( nums[i] );
    }

    string result;
    sort( numsString.begin(), numsString.end(), comp );

    for ( size_t i = 0; i < numsString.size(); i++ )
    {
        result += numsString[i];
    }

    return result;
}

int main()
{
    // Works okay if the size of vector is less than 17
    vector<int> nums( 17, 0 );
    largestNumber( nums );
}
Run Code Online (Sandbox Code Playgroud)

-std=c++14在Windows 7 64位上使用带有标志的TDM-GCC 4.9.2 .

每次输入向量的大小超过16
时,我都会收到运行时错误.我做错了什么?

And*_* DM 6

vector<string> numsString最终的所有元素都将相同的值0转换为字符串:

vector<int> nums( 17, 0 );
//                    ^
Run Code Online (Sandbox Code Playgroud)

并且,在您的comp函数中,您不会检查数字是否相等.
在函数的顶部添加它:

if (num1 == num2) return false;
Run Code Online (Sandbox Code Playgroud)

  • 在顶部检查字符串是否相等只会浪费时间并掩盖更基本问题的**部分**。总体比较应避免所有 A&lt;B 为真且 B&lt;A 为真的情况。在进行此类更正的过程中,您将得到 A&lt;A false,而不需要对 == 进行额外测试 (2认同)