#include <iostream> // std::cout #include <algorithm> // std::for_each #include <string> // std::string #include <vector> // std::vector #include <functional> using namespace std; class Address { public: Address(string url) :url(url) {}; void display() { cout << "url:" << this->url << endl; } private: string url; }; int main() { vector<Address>adds{ Address("http://c.biancheng.net/stl/"), Address("http://c.biancheng.net/java/"), Address("http://c.biancheng.net/python/") }; //手動編寫迴圈結構 cout << "first:n"; for (auto it = adds.begin(); it != adds.end(); ++it) { (*it).display(); } //呼叫 STL 標準庫中的演算法函數 cout << "second:n"; for_each(adds.begin(), adds.end(), mem_fun_ref(&Address::display)); return 0; }程式執行結果為:
first:
url:http://c.biancheng.net/stl/
url:http://c.biancheng.net/java/
url:http://c.biancheng.net/python/
second:
url:http://c.biancheng.net/stl/
url:http://c.biancheng.net/java/
url:http://c.biancheng.net/python/
for (auto it = adds.begin(); it != adds.end(); ++it) { (*it).display(); }此段程式碼中,每一次迴圈都要執行一次 end() 方法,事實上該方法並不需要多次呼叫,因為它的值自始至終都沒有發生改變。也就是說,end() 方法只需要呼叫一次就夠啦,for_each() 函數就對這一點進行了優化:
for_each(adds.begin(), adds.end(), mem_fun_ref(&Address::display));可以看到,通過將 end() 方法作為引數傳入 for_each() 函數,該方法只執行了 1 次。當然,這也僅是眾多優化中的一處。事實上,STL 標準庫的開發者對每個演算法函數的底層實現程式碼都多了優化,使它們的執行效率達到最高。
當然,只有熟悉 STL 標準庫提供的函數,才能在實際程式設計時想到使用它們。作為一個專業的 C++ 程式設計師,我們必須熟悉 STL 標準庫中的每個演算法函數,並清楚它們各自的功能。總之,STL 開發者比使用者更了解內部的實現細節,他們會充分利用這些知識來對演算法進行優化。
C++ STL 標準庫中包含 70 多個演算法函數,如果考慮到函數的過載,大約有 100 多個不同的函數模板。本章僅介紹一些常用的演算法函數,如果想了解全部的 STL 演算法,讀者可參考 C++ STL標準庫官網。