要实现以下sort()的三参数自定义用法,结果报错,如下: 经查询: sort()定义:
void sort(排序首地址,排序末地址+1,比较函数名称); //比较函数: bool compare(参与比较的第一个元素,参与比较的第二个元素) { return 1st>2nd;//降序,大数在前 //return 1st<2nd;//升序,小数在前 }注意:sort()要求函数对象是 ,静态/全局函数指针,非静态成员函数指针不能直接传递给std::sort()。
所以报错原因:自定义比较函数放在类内,但是没有设置它为静态成员函数。 解决方案:类内——加上static关键字,设置为静态成员函数;类外——全局函数。 记录类成员函数程序,以及输入输出完整程序。 例子程序是实现,重新排列一组非负整数使之成为最大数。
//自定义sort()函数对象必须是静态或全局函数指针 //可以不写static,直接放类外,做全局 bool compare(const string& s1,const string& s2){ string str1=s1+s2; string str2=s2+s1; return str1>str2;//自定义比较函数,返回大的字符串 } class Solution { public: string largestNumber(vector<int>& nums) { if(nums.empty())return ""; string res; vector<string>numstr;//整型转化成字符串型,进行拼接比较 for(int n:nums){ numstr.push_back(to_string(n)); } /*字符串流*/ //整型转化为字符串型 // for(int i=0;i<nums.size();i++){ // stringstream s;//定义一个字符串流 // s<<nums[i];//加载数组值 // string temp=s.str();//再取字符串,相当于把整型转化为字符串 // numstr.push_back(temp);//压入字符串数组 // } //Lamda表达式来自定义sort函数,返回大值 //sort(numstr.begin(),numstr.end(),[](string s1,string s2){return s1+s2 > s2+s1;}); sort(numstr.begin(),numstr.end(),compare); for(int i=0;i<nums.size();i++){ res+=numstr[i]; if(numstr[0]=="0")break;//考虑全0的情况 } //if(res[0]=='0')return "0"; return res; } };完整程序,方便调试:
#include <iostream> #include <vector> #include <string> using namespace std; bool compare(const string& s1, const string& s2){ string str1 = s1 + s2; string str2 = s2 + s1; return str1>str2;//自定义比较函数,返回大的字符串 } string largestNumber(vector<int>& nums) { if (nums.empty())return ""; string res; vector<string>numstr;//整型转化成字符串型,进行拼接比较 for (int n : nums){ numstr.push_back(to_string(n)); } //Lamda表达式来自定义sort函数,返回大值 //sort(numstr.begin(),numstr.end(),[](string s1,string s2){return s1+s2 > s2+s1;}); sort(numstr.begin(), numstr.end(), compare); for (int i = 0; i<nums.size(); i++){ res += numstr[i]; } return res; } int main(){ vector<int>nums; int temp; while (cin>>temp){ nums.push_back(temp); } /*for (auto n : nums){ cout << n << endl; }*/ string res=largestNumber(nums); cout << res; system("pause"); return 0; }顺便记录一下,例子程序: 逻辑思路:一组整数,先转换成字符串型,方便拼接;再利用sort()函数自定义比较函数输出大数在前顺序;比较函数两两字符串先拼接再比大小;最后比完大小从头拼一起就是最大数。 涉及知识点: 1、整型转换为字符串型: (1)to_string:头文件string,直接将整型转换为字符串型。
for (int n : nums){ numstr.push_back(to_string(n)); }(2)stringstream:头文件sstream,定义一个字符串流,加载数组值,取字符串,压入字符串数组。
for(int i=0;i<nums.size();i++){ stringstream s;//定义一个字符串流 s<<nums[i];//加载数组值 string temp=s.str();//再取字符串,相当于把整型转化为字符串 numstr.push_back(temp);//压入字符串数组 }2、解决sort()自定义比较函数问题: 因为一开始搞不明白为什么一直报错,所以用Lambda表达式做的。实测,好用!
//Lamda表达式来自定义sort函数,返回大值 sort(numstr.begin(),numstr.end(),[](string s1,string s2){return s1+s2 > s2+s1;});3、写输入程序,需要输入一组整数到vector向量里。 其中:利用ctrl + z结束输入。划重点!!!
vector<int>nums; int temp; while (cin>>temp){ nums.push_back(temp); } /*for (auto n : nums){ cout << n << endl; }*/ system("pause");