算法是個龐大的主題,STL包含了超過100個算法,僅僅記住算法的名字就已經很蛋疼了。所以我在這將范圍縮小一點:主要討論STL算法中的遍歷、排序、查找這幾類算法。 遍歷算法常用的有for_each、transform、copy這三種。for_each接受一項操作,如果該操作的參數是用引用方法傳遞,則它可以變動其遍歷的元素,反之不能。transform是一個變動性算法,它運用某項操作,該操作返回被改動後的參數。它比for_each更靈活,能同時對三個容器的元素進行操作。copy算法正向遍歷給定區間,將區間內的元素分別復制到另一個指定容器的迭代器指向的元素空間,這個算法需要注意目的容器的大小要大於等於源容器的大小。下面寫出這三種算法的一般寫法: #include <iostream> #include <vector> #include <list> #include <map> #include <set> #include <algorithm> #include <iterator> #include <string> using namespace std; template <typename Container> void PrintElements(Container c) { typedef typename iterator_traits<Container::iterator>::value_type type; //提取出其 typedef Container::value_type type; //獲得類型 cout << endl; ostream_iterator<type> os(cout, "\t"); copy(c.begin(), c.end(), os); } template <typename T> void PrintElement(T value) { cout << value << "\t"; } template <typename T> T DoubleParameter(T value) { return 2 * value; } int main() { vector<int> vecSource; list<int> lstDest; for (int i = 0; i < 10; ++i) { vecSource.push_back(i); } for_each(vecSource.begin(), vecSource.end(), PrintElement<int>); // 確保lstDest有足夠的空間 lstDest.resize(vecSource.size()); transform(vecSource.begin(), vecSource.end(), lstDest.begin(), DoubleParameter<int>); PrintElements(lstDest); } 排序算法以sort為代表,sort默認以操作符<來進行排序,如果要指明排序規則,就必須自定義一個排序方法。示例代碼如下: #include <iostream> #include <vector> #include <list> #include <map> #include <set> #include <algorithm> #include <iterator> #include <string> #include <functional> #include <ctime> using namespace std; template <typename Container> void PrintElements(Container c) { typedef Container::value_type type; //獲得類型 cout << endl; ostream_iterator<type> os(cout, "\t"); copy(c.begin(), c.end(), os); } int main() { srand((unsigned) time(NULL)); vector<int> vecSource; for (int i = 0; i < 50; ++i) { vecSource.push_back( rand()% 10000); } cout << "排序之前:" ; PrintElements(vecSource); sort(vecSource.begin(), vecSource.end()); cout << endl << "默認排序之後:" ; PrintElements(vecSource); // 在這裡,我們不用默認的less<int>排序, 改成greater<int>排序 sort(vecSource.begin(), vecSource.end(), greater<int>()); cout << endl << "反向排序之後:" ; PrintElements(vecSource); } 查找算法以find為例。我們知道,在不同的元素排放順序上,有不同的查找對策。比如,對於已經排好序的元素列表,使用二分法查找,是最快的。如果是未排序的列表,那麼只能一個個遍歷了。STL中,有些容器在內部是已經排好序的,比如map、set等。如果要查找一個元素,最好要先查看該容器是否已經提供了查找算法,如果沒有提供,再用通用的find算法。代碼示例如下: #include <iostream> #include <vector> #include <list> #include <map> #include <set> #include <algorithm> #include <iterator> #include <string> #include <functional> #include <ctime> using namespace std; int main() { srand((unsigned) time(NULL)); vector<int> vecSource; set<int> st; int element = 0; for (int i = 0; i < 500; ++i) { element = rand()% 1000; vecSource.push_back( element); st.insert(element); } vector<int>::const_iterator iterVec = find(vecSource.begin(), vecSource.end(), 111); if (iterVec != vecSource.end()) { cout << "found " << *iterVec << endl; } else { cout << "not found in vector" << endl; } set<int>::const_iterator iterSt = st.find(222); if (iterSt != st.end()) { cout << "found " << *iterSt << endl; } else { cout << "not found in set" << endl; } }