c++实验七--01串排序

 题目描述

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;
}

运行结果

6525441fb0544fcaa90af5c0d8573bfb.png

若cmp是非静态成员函数,则会报错

1a3601e94bbe4d37a825364ad0375fcf.png79294b5bf7564724abfc43b79169ac3a.png

这些错误是由于在C++中不正确地使用成员函数作为排序比较函数导致的。`std::sort`函数需要一个有效的比较函数或函数对象,这个比较函数或对象必须接受两个参数(在这里是字符串)并返回一个布尔值来表示它们的相对顺序。

在`Secretkey`类中定义的`cmp`成员函数是一个成员函数,它隐式地有一个额外的`this`参数,因此它不能直接用作`std::sort`的比较函数。要解决这个问题,你有几个选项:

1. **使用lambda表达式**:在C++11及更高版本中,你可以使用lambda表达式来定义一个匿名函数,并将其作为`std::sort`的比较函数。这种方式不需要修改`cmp`成员函数。

 35d3449b69134a0a902bbae7fbeafc05.png

2. **使`cmp`成为静态成员函数**:通过将`cmp`函数声明为静态成员函数,你可以消除`this`指针,但这样你就无法直接访问类的非静态成员。不过,对于只比较字符串长度的情况,这是可行的。

3. **创建一个独立的比较函数或函数对象**:你可以在类外部定义一个比较函数或函数对象,并将其作为`std::sort`的比较函数。

可查询有关sort函数和 lambda表达式的用法

 

 

 

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值