这道题我卡在传递函数对象上,说到底函数对象实质是一个类的对象,只是通过重载()运算符达到函数的作用。所以定义函数对象为形参时,应该同普通类型一样,以类型名+对象名的形式展现。
如此,我也发现函数对象和函数作为实参时的不同点:函数是直接写函数名,函数对象则是类名+(),应该是生成了一个临时参数。
--------以下是题目--------
描述
请按照要求对输入的字符串进行排序。
#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个字符串,字符串之间以空格间隔(不会出现字符串首字母相同的情况)
-------------以下是填充的代码--------------
bool operator < (const class A& a1, const class A &a2)
{
return a1.get_size() < a2.get_size();
}
struct Print
{
void operator()(A a) { cout << a<< " "; }
};
void Show(list<A>::iterator i, list<A>::iterator j, Print p)
{
list<A>::iterator k = i;
for (; k != j; k++)
p(*k);
}
template<class T>
struct MyLarge{
bool operator()(const T &t1,const T&t2)
{
return t1.get_name() < t2.get_name();
}
};