之前寫過一帖,避免重復代碼——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