程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 避免重復代碼——know your library(續)(1)

避免重復代碼——know your library(續)(1)

編輯:關於C語言

之前寫過一帖,避免重復代碼——know your library。今天外面下雨心情不咋,干脆再來發發牢騷好了 =v=

上周某公司來這邊招聘,C++版的卷裡據說有一題是要求對一個裝有自定義的struct的vector做排序的。struct有兩個fIEld,一個int num和一個string name;排序要求按照num升序,如果num相等則按照name升序。原題到底是啥樣的我不知道,不過據說就是一個裸的struct,或許是這樣?

C++代碼   

struct Person {
    int num;
    string name;
};

Hmm...不知道原題裡的有沒有構造函數呢。隨便了。反正它上面是沒有重載<或==運算符的。另外,聽同學說原題裡的vector裡裝的是實例而不是指針,所以下面的代碼也反映了這點。不是我想放實例進去的哦 OTL

於是要排序。嗯,當時聽到一群剛考完的同學回到機房在討論排序算法該怎麼寫之類的。但這是C++诶,有標准庫來解決這問題,沒必要自己動手不是麼?

最低限度的,例如說這樣:

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) {
    }
};
 
namespace std {
    template<>
    struct less<Person> {
        bool operator ()(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;
        }
    };
}
 
struct printElement {
    void Operator ()(const Person& p) {
        cout << "Person: " << p.num << ", " << p.name << endl;
    }
};
 
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")));
  
    sort(v.begin(), v.end(), less<Person>());
  
    for_each(v.begin(), v.end(), printElement());
}
 
// Output:
// Person: 1, john
// Person: 1, micheal
// Person: 2, micheal
// Person: 2, smith
// Person: 3, albert
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved