避免重复代码——know your library(续)2011-06-26 iteye rednaxelaFX之前写过一帖,避免重复代码——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