避免重复代码——know your library(续)
2009-06-03 08:30:30 来源:WEB开发网核心提示: (懒得用struct的initializer所以给Person加了个构造函数……不算作弊吧 =v=) 排序本身就用STL里的std::sort()就完事了,因为Person上没有定义<运算符,避免重复代码——know your library(续)(2),
(懒得用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;
}
}
更多精彩
赞助商链接