仿函数排序——7-4 字符串排序--string类的使用(30 分)

965 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

题目描述:

先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串不多于一百个字符。
如果在输入过程中输入的一个字符串为“stop”,也结束输入。
然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。如果存在多个字符串长度相同,则按照原始输入顺序输出。

输入格式:

字符串的个数,以及该组字符串。每个字符串以‘\n’结束。如果输入字符串为“stop”,也结束输入.

输出格式:

可能有多组测试数据,对于每组数据,
将输入的所有字符串按长度由小到大排序输出(如果有“stop”,不输出“stop”)。

输入样例:

4
faeruhyytrjh tjytj
hsrthts   hjnshtgfhs
stop
3
htrskbns
bsartanjsf tyjndyt
nsr jj jtey

输出样例:

faeruhyytrjh tjytj
hsrthts   hjnshtgfhs
htrskbns
nsr jj jtey
bsartanjsf tyjndyt

###提示:
根据输入的字符串个数来动态分配存储空间(采用new()函数)。每个字符串会少于100个字符。
测试数据有多组,注意使用while()循环输入。

###来源:
数据结构高分笔记

PS:不要被这30分给吓到了,看过我C++硬货——vector头文件【保姆级教学】的同学应该觉得这题简简单单,30分直接到手,一遍AC!!!

思路分析:

1.首先处理一下循环输入的问题,用while(cin>>s)的方式来循环输入(需要注意的是在VS里面无法结束,但是在pta平台可以结束)

2.创建结构体,一个是int类型来记录顺序的值,一个就是string记录字符串本身

3.毫无疑问的getline输入

4.按照我的思路写一个仿函数

5.用最为安全的迭代器输出,在循环完一次的末尾记得clear

代码如下:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;

struct str
{
    
	int shunxu;
	string s;
};

bool Mysort(str& a, str& b) {
	if (a.s.size() == b.s.size())
		return a.shunxu < b.shunxu;
	else
		return a.s.size() < b.s.size();
}

int main()
{
	int n;
	vector<str>ss;
	string a;
	while (cin >> n) {
		getchar();
		str temp;
		for (int i = 0; i < n; i++) {
			getline(cin, temp.s);
			temp.shunxu = i;
			if (temp.s == "stop")
				break;
			else {
				ss.push_back(temp);
			}
		}
		sort(ss.begin(), ss.end(), Mysort);
		for (vector<str>::iterator it = ss.begin(); it != ss.end(); it++) {
			cout << it->s << endl;
		}
		ss.clear();
	}
	return 0;
}

结果如下:

image.png PS:成功解题=理清思路+一定的技巧~