C++程式設計 期末考試 程式設計題#7 字串排序
阿新 • • 發佈:2019-02-08
這道題我卡在傳遞函式物件上,說到底函式物件實質是一個類的物件,只是通過過載()運算子達到函式的作用。所以定義函式物件為形參時,應該同普通型別一樣,以型別名+物件名的形式展現。
如此,我也發現函式物件和函式作為實參時的不同點:函式是直接寫函式名,函式物件則是類名+(),應該是生成了一個臨時引數。
--------以下是題目--------
描述
請按照要求對輸入的字串進行排序。
#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(); } };