首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

避免重複造輪子——善用標準庫(續一):C++ 面試題排序向量的 STL 最佳實踐

     編輯:關於C語言

題目還原

對 vector 排序,Person = {int num; string name;},規則:num 升序,相同則 name 升序。無 operator<、無建構函數、存實例非指標。

同學討論焦點:快排/合併排序怎麼寫?

錯誤方向!C++ 有 <algorithm> 標準庫,std::sort 平均 O(N log N)、Introsort 混合演算法,效能與穩健度遠超手寫。

最小可行方案:特化 std::less + for_each 列印

#include     
using namespace std;
struct Person { int num; string name; 
    Person(int n, string s) : num(n), name(s) {} };
namespace std {
    template<> struct less {
        bool operator()(const Person& p1, const Person& p2) const {
            if (p1.num < p2.num) return true;
            if (p1.num == p2.num && p1.name < p2.name) return true;
            return false;
        }
    };
}
struct PrintPerson { void operator()(const Person& p) const { 
    cout << "Person: " << p.num << ", " << p.name << endl; 
} };
int main() {
    vector v;
    v.push_back(Person(2,"smith")); v.push_back(Person(1,"john"));
    v.push_back(Person(2,"micheal")); v.push_back(Person(1,"micheal"));
    v.push_back(Person(3,"albert"));
    sort(v.begin(), v.end(), less());
    for_each(v.begin(), v.end(), PrintPerson());
}

輸出:

Person: 1, john
Person: 1, micheal
Person: 2, micheal
Person: 2, smith
Person: 3, albert

核心訊息:**知識庫裡已有解決方案,別重複造輪子**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved