首页 > 解决方案 > 需要帮助理解 sort() c++ 函数的奇怪行为

问题描述

我有一个比较器函数,它比较两个字符串,这些字符串表示没有前导零的数字,例如“123”或“5”。

bool comp(string s1,string s2){
    if(s1.size()!=s2.size())
        return s1.size()<s2.size();

    int i=0;
    while(i<s1.size() && s1[i]==s2[i])
        i++;

    if(i==s1.size())
        return true;

    return s1[i]<s2[i]; 
}

除了字符串 nums 的向量,我还使用如下的 sort() 函数:

sort(nums.begin(),nums.end(),comp);

这个函数将适用于这个向量: {"5","5","5","5","5","5","5","5","5","5","5","5","5","5","5","5"}

但是,如果我在向量中再添加一个“5”,它会抛出这个:

在抛出 'std::length_error' 的实例后调用终止

什么():basic_string::_M_create

这里发生了什么?

标签: c++sorting

解决方案


您的比较器不尊重严格的弱排序

相等性检查

if (i == s1.size())
    return true;

应该

if (i == s1.size())
    return false;

或者,使用<tuple>facility 可确保严格的弱排序:

bool comp(const std::string& s1, const std::string& s2)
{
    return std::forward_as_tuple(s1.size(), s1)
         < std::forward_as_tuple(s2.size(), s2);
}

推荐阅读