C++中的algorithm庫中有幾個經常使用的模板函數,寫算法題時常常用到,如下將其概括總結一下(swap,reverse,sort):算法
swap()dom
template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; }
上面是swap函數的定義,實際上c就至關於咱們平時寫的temp臨時變量,但實際上該方法並非一個高效率的方法,由於該函數涉及到了一次複製構造和兩次複製,特別是在交換的變量所佔空間特別大的時候,最好採用其餘方法實現(好比經過異或實現交換)。函數
reverse()code
template <class BidirectionalIterator> void reverse (BidirectionalIterator first, BidirectionalIterator last) { while ((first!=last)&&(first!=--last)) { std::iter_swap (first,last); ++first; } }
reverse函數反轉[first, last)區間的數據,first和last都是迭代器。對象
sort()
sort函數對[first, last)區間的函數進行排序,查看源碼可知使用的是快速排序法。排序
template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
第三個參數comp可不寫,不寫第三個參數的話默認是升序排列。
若是想要降序排列,第一種方法是sort以後再使用reverse。
第二種方法是將 greater<int>() 添加到第三個參數中,注意greater函數是在funtional頭文件中的,若是你要比較的對象是int,則尖括號中寫int,若是不是則寫你須要排序的元素的類型。
第三種方法則是本身寫比較函數,特別是當你排序的元素是結構體或類的對象。源碼
bool bigger(struct a, struct b) { return (a.score > b.score); }
struct student{ string name; char gender; int score; }; vector<student> v; sort(v.begin(), v.end(), bigger);
注意比較函數中的兩個參數必須是vector中元素的類型,如此處vector v中的元素是一個struct類型,則比較函數的兩個參數也必須是struct類型。string