错误:malloc():用于排序的比较函数中的内存损坏

时间:2015-11-02 03:24:03

标签: c++ stl

以下代码用于打印整数列表中的最大数字。我得到了:

 *** Error in `./a.out': malloc(): memory corruption: 0x0000000000bfe070 ***
列表中的

(20个零):

 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

但是在上面,如果我放了一些非零元素,我就不会收到错误。

这是我的比较函数代码:

bool comp(int a,int b)
{
     if(a == b)
         return true;
     stringstream ss;
     ss << a;
     string a1 = ss.str();
     stringstream sss;
     sss << b;
     string b1 = sss.str();
     int i = 0;
     int l1 = a1.length();
     int l2 = b1.length();
     while(i < l1 && i < l2)
     {
         if(a1[i] > b1[i])
             return true;
         if(a1[i] < b1[i])
             return false;
         i++;
     }
     if(l1 == l2)
         return true;
     if(l1 < l2)
         if(b1[l1] > a1[0])
             return false;
         else
             return true;
     else
         if(a1[l2] > b1[0])
             return true;
         else
             return false;
}

我正在使用stl

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

其中nums是整数向量。

编辑1:

这是整个代码:

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

using namespace std;
bool comp(int a,int b)
{
if(a == b)
    return true;
stringstream ss;
ss << a;
string a1 = ss.str();
stringstream sss;
sss << b;
string b1 = sss.str();
int i = 0;
int l1 = a1.length();
int l2 = b1.length();
while(i < l1 && i < l2)
{
    if(a1[i] > b1[i])
        return true;
    if(a1[i] < b1[i])
        return false;
    i++;
}
if(l1 == l2)
    return true;
if(l1 < l2)
    if(b1[l1] > a1[0])
        return false;
    else
        return true;
else
    if(a1[l2] > b1[0])
        return true;
    else
        return false;
}
void largestNumber(vector<int>& nums)
{

sort(nums.begin(),nums.end(),comp);
/*string s = "";
vector<int>::iterator it = nums.begin();
while(it != nums.end())
{
    stringstream ss;
    ss << *it;
    s = s+ss.str();
    it++;
}
return s;*/
}



int main()
{
int n;
cin>>n;
vector<int> arr(n);
for(int i = 0;i<n;i++)
    cin>>arr[i];

largestNumber(arr);/*
string s = largestNumber(arr);
cout<<s<<endl;*/
}

2 个答案:

答案 0 :(得分:5)

您的补偿功能违反了strict weak ordering rule。排序要求比较函数应满足严格的弱排序规则。如果该承诺被破坏,那么std :: sort的承诺也是正确的。事实上当我在MSVC(VS2015)下编译它时,我得到一个断言失败,即比较函数不符合排序条件。 例如,这一行:

bool comp(int a,int b)
{
    return to_string(a) < to_string(b);
}

显然违反了这个条件。查看this帖子以获取更多见解。

顺便说一句,如果您只想按字典顺序对整数进行排序,您可以这样做

hour = raw_input("Enter Hours")
rate = raw_input("Enter rate")  

if hour <= 40 :
# for less than 40 this part not executing    
    pay = float(hour)*float(rate) 
    print pay
else:   
    pay = (40*int(rate))+((float (hour)-40)*15)
    print pay

如果你想要相当于“更大的数字第一”,只需交换&lt;使用&gt;

答案 1 :(得分:0)

我已经使用了您的comp函数并创建了一个示例案例研究来检查错误。但是,我没有收到array of zeros案例的任何错误。请检查示例程序。

错误

但是,以下方案会导致运行时错误。

// Pay attention: Array stores numbers in descending order.
// If we stored in ascending order, there won't be a problem.
for(int i=20; i>0; ++i)
    v.push_back(i);

我希望这对找到解决方案很有帮助。

示例程序

#include <vector>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <iterator>

using namespace std;

bool comp(int a,int b)
{
     if(a == b)
         return true;
     stringstream ss;
     ss << a;
     string a1 = ss.str();
     stringstream sss;
     sss << b;
     string b1 = sss.str();
     int i = 0;
     int l1 = a1.length();
     int l2 = b1.length();
     while(i < l1 && i < l2)
     {
         if(a1[i] > b1[i])
             return true;
         if(a1[i] < b1[i])
             return false;
         i++;
     }
     if(l1 == l2)
         return true;
     if(l1 < l2)
         if(b1[l1] > b1[l1-1])
             return false;
         else
             return true;
     else
         if(a1[l2] > a1[l2-1])
             return true;
         else
             return false;
}

int main(int argc, const char *argv[])
{
    vector<int> v;
    for(int i=0; i<20; ++i)
        v.push_back(0);
    sort(v.begin(), v.end(), comp);
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
    return 0;
}