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

Posted

技术标签:

【中文标题】使用自定义比较器进行排序时出现运行时错误【英文标题】:Runtime error in sorting with custom comparator 【发布时间】:2015-07-09 10:12:14 【问题描述】:

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

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

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

每次输入向量的大小大于 16 时都会出现运行时错误。 我做错了什么?

【问题讨论】:

我不知道。每当我运行程序时,都会出现一个对话框,上面写着 &lt;exe&gt; has stopped working. A problem caused the program to stop working correctly. Please close the program. 没有。以前没用过,也不知道怎么用。 ToString 的定义可能有用。 你应该使用一个合理的自定义比较函数。最重要的应该是 Asort 的内部结构,无法预测不稳定的比较函数将如何发生故障。所以我不确定这是你的主要问题 在发现 num1 和 num2 等于较短的长度后,您的代码似乎将 num1 的其余部分(如果有)与自身的较早部分(而不是 num2 的任何部分)进行比较)。这真的是你的意图吗? 【参考方案1】:

vector&lt;string&gt; numsString 中的所有元素最终都具有相同的值 0 转换为字符串:

vector<int> nums( 17, 0 );
//                    ^

而且,在您的 comp 函数中,您没有检查数字是否相等。 在函数顶部添加:

if (num1 == num2) return false;

【讨论】:

在顶部检查字符串是否相等只会浪费时间并掩盖更基本问题的部分。整体比较应避免 A 进行额外测试

以上是关于使用自定义比较器进行排序时出现运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

在 vs2017 中运行自定义工具时出现 T4 错误

使用自定义框架时出现“找不到图像”错误

自定义授权过滤器在运行时出现异常

通过引用使用函数调用时出现运行时错误?

在运行SQL时出现错误,请问如何解决?

在类中使用自定义排序时出现编译错误 [重复]