(懶得用struct的initializer所以給Person加了個構造函數……不算作弊吧 =v=)
排序本身就用STL裡的std::sort()就完事了。因為Person上沒有定義<運算符,需要自己寫個functor來實現這個比較;懶得再發明別的名字,干脆就對std::less對Person做個特化算了。诶,自己寫排序多麻煩啊……
我不是說程序員不需要掌握各種基本排序算法的原理和實現方法,掌握基本攻還是絕對必要的。只不過原理容易掌握,真正要寫出production-quality code很難;既然標准庫裡有了,功能和性能都能滿足需要的話,就不必自己動手了。萬一自己寫錯了豈不是更糟?維護一個更大的codebase也不是好玩的事 XD
切一下題:STL是個大寶庫,裡面已經有很多神奇的東西了;能稱得上支持“標准C++”的編譯器肯定都帶有STL的實現,所以你(和你的上司)沒有拒絕STL的理由(前提是你們用的是標准C++)。其它強悍的庫,像Boost之類的,目前還沒有被包含在標准裡,所以用不用倒是看自己了。
等C++0x出來之後就更方便了……
C++代碼
#include <algorithm> #include <functional> #include <iOStream> #include <string> #include <vector> using namespace std; struct Person { int num; string name; Person(int num, string name) : num(num), name(name) { } }; int main() { vector<Person> v; v.push_back(Person(2, string("smith"))); v.push_back(Person(1, string("john"))); v.push_back(Person(2, string("micheal"))); v.push_back(Person(1, string("micheal"))); v.push_back(Person(3, string("albert"))); // use the new lambda syntax sort(v.begin(), v.end(), [](const Person& p1, const Person& p2) { if (p1.num < p2.num) return true; if (p1.num == p2.num && p1.name < p2.name) return true; return false; }); // use the new "range-based for statement" for (Person p : v) { cout << "Person: " << p.num << ", " << p.name << endl; } }