题目描述
01串排序
Time Limit:1000MS Memory Limit:32768K
Description:
将01串首先按长度排序,长度相同时,按1的个数多少进行排序,1的个数相同时再按ASCI码值排序。
Input:
输入数据中含有一些01串,01串的长度不大于256个字符。
Output:
重新排列01串的顺序。使得串按基本猫述的方式排序。
Sample Input:
100111111
00001101
1010101
1
0
1100
Sample Output:
0
1
1100
1010101
00001101
10011111
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
class Secretkey {
vector<string>s;//使用vector代替数组,可以动态增长
int i, count = 0;//count 由于记录输入的字符串数
public:
void input()
{
string temp;
while(getline(cin,temp)&&!temp.empty())//使用getline读取整行,检查是否为空字符串来结束输入,可以有效跳出循环
{
s.push_back(temp); count++;
}
}
void operate()
{
sort(s.begin(), s.end(), cmp);//用sort函数按要求对s进行排序,通过cmp函数可以控制按什么要求来进行排序,记得将cmp申明为静态成员函数,否者会报错
}
void show()
{
for (int i = 0; i < count; i++)
cout << s[i] << endl;
}
//定义cmp函数
static bool cmp(string& a, string& b) {
if (a.length() != b.length())
return a.length() < b.length();//按长度升序排序
else if (Secretkey::one(a) != Secretkey::one(b))
return Secretkey::one(a) < Secretkey::one(b);//长度相同,按“1”个数升序排序
else return a < b;//“1”个数相同,按字典序排序
}
static int one(string& a);
};
//求“1”在字符串s中出现的个数
int Secretkey::one(string& a) {
int num = 0;
for (int i = 0; i = a.find("1", i) != -1; i++, num++)//stl中的find函数,从i开始查找“1”,返回其出现的位置
return num;
}
int main()
{
Secretkey ff;
ff.input();
ff.operate();
ff.show();
return 0;
}
运行结果
若cmp是非静态成员函数,则会报错
这些错误是由于在C++中不正确地使用成员函数作为排序比较函数导致的。`std::sort`函数需要一个有效的比较函数或函数对象,这个比较函数或对象必须接受两个参数(在这里是字符串)并返回一个布尔值来表示它们的相对顺序。
在`Secretkey`类中定义的`cmp`成员函数是一个成员函数,它隐式地有一个额外的`this`参数,因此它不能直接用作`std::sort`的比较函数。要解决这个问题,你有几个选项:
1. **使用lambda表达式**:在C++11及更高版本中,你可以使用lambda表达式来定义一个匿名函数,并将其作为`std::sort`的比较函数。这种方式不需要修改`cmp`成员函数。
2. **使`cmp`成为静态成员函数**:通过将`cmp`函数声明为静态成员函数,你可以消除`this`指针,但这样你就无法直接访问类的非静态成员。不过,对于只比较字符串长度的情况,这是可行的。
3. **创建一个独立的比较函数或函数对象**:你可以在类外部定义一个比较函数或函数对象,并将其作为`std::sort`的比较函数。
可查询有关sort函数和 lambda表达式的用法