WEB开发网
开发学院软件开发C语言 避免重复代码——know your library(续) 阅读

避免重复代码——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;
    }
}

Tags:避免 重复 代码

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接