您的位置:首页 > 编程语言 > C语言/C++

编程题#7:字符串排序(C++程序设计第10周)

2016-02-16 21:55 483 查看
描述

请按照要求对输入的字符串进行排序。

#include <iostream>
#include <string>
#include <list>
using namespace std;

class A{
private:
string name;
public:
A(string n) :name(n){}
friend bool operator < (const class A& a1, const class A &a2);
friend bool operator == (const class A &a1, const class A &a2){
if (a1.name.size() == a2.name.size())
return true;
else
return false;
}
friend ostream & operator << (ostream &o, const A &a){
o << a.name;
return o;
}
string get_name() const{
return name;
}
int get_size() const{
return name.size();
}
};
// 在此处补充你的代码
int main(int argc, char* argv[])
{
list<A> lst;
int ncase, n, i = 1;
string s;
cin >> ncase;
while (ncase--){
cout << "Case: "<<i++ << endl;
cin >> n;
for (int i = 0; i < n; i++){
cin >> s;
lst.push_back(A(s));
}
lst.sort();
Show(lst.begin(), lst.end(), Print());

cout << endl;
lst.sort(MyLarge<A>());
Show(lst.begin(), lst.end(), Print());
cout << endl;
lst.clear();
}
return 0;
}


输入

第一行是正整数T,表示测试数据的组数

每组测试数据输入共两行,

第一行是正整数N,表示字符串个数

第二行是N个字符串, 字符串间用空格分离

输出

对于每组测试数据,先输出一行:

Case: n

如对第一组数据就输出Case: 1

第二行按照字符串长度从小到大排序之后输出N个字符串,字符串之间以空格间隔(不会出现字符串长度相同的情况)

第三行按照字符串首字符ASCII码序从小到大排序之后输出N个字符串,字符串之间以空格间隔(不会出现字符串首字母相同的情况)

样例输入

2
4
a bnss ds tsdfasg
5
aaa bbbb ccccd sa q


样例输出

Case: 1
a ds bnss tsdfasg
a bnss ds tsdfasg
Case: 2
q sa aaa bbbb ccccd
aaa bbbb ccccd q sa


源码

#include <iostream>
#include <string>
#include <list>
using namespace std;

class A//定义类A,并以友元重载<, == 和 <<
{
private:
string name;
public:
A(string n): name(n) {}
friend bool operator < (const class A& a1, const class A& a2);
friend bool operator == (const class A& a1, const class A& a2)
{
if (a1.name.size() == a2.name.size())
{
return true;
}
else
{
return false;
}
}
friend ostream& operator << (ostream& o, const A& a)
{
o << a.name;
return o;
}
string get_name() const
{
return name;
}
int get_size() const
{
return name.size();
}
};
//在此处补充你的代码
bool operator < (const A& a1, const A& a2)
{
return a1.get_size() < a2.get_size();
}

template <class Iterator, class Function>//函数模板
void Show(Iterator begin, Iterator end, Function print)
{
for (Iterator iterator1 = begin; iterator1 != end; iterator1++)
{
print(*iterator1);
}
}

class Print //函数对象类
{
public:
void operator() (const A& a)
{
cout << a.get_name() << " ";
}
};

template <class A>  //函数对象类模板
struct MyLarge
{
inline bool operator() (const A& a1, const A& a2)
{
return a1.get_name() < a2.get_name();
}
};

int main(int argc, char* argv[])
{
list<A> lst;
int ncase, n, i = 1;
string s;
cin >> ncase;
while(ncase--)
{
cout << "Case: " << i++ << endl;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> s;
lst.push_back(A(s));
}
lst.sort();//如上已经重载的A类型的“<”号,按尺寸排序
Show(lst.begin(), lst.end(), Print());//Print()为函数对象,用途类似于函数指针或函数名字

cout << endl;
lst.sort(MyLarge<A>());//按照函数对象的方式进行排序
Show(lst.begin(), lst.end(), Print());
cout << endl;
lst.clear();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: