在之前的博客中我們學習了很多STL中的模板庫,包括deque,queue,stack,list等,他們都是一種數據結構,也就是說STL已經為我們實現了。今天我們來講講STL中比較大的一個庫. 主要是一些算法的運算的實現,示例代碼上傳至 https://github.com/chenyufeng1991/STL_algorithm 。
在使用STL中的algorithm之前,需要導入頭文件#include.
(1)max(),min()
void MaxAndMin() { int maxI = 3; int maxJ = 4; cout << "較大值為:" << max(maxI,maxJ) << endl; cout << "較小值為:" << min(maxI,maxJ) << endl; }
(2)由於下面有些方法的示例需要打印vector,所以我在這裡先實現vector的打印算法
void PrintVector(vectorv) { vector ::iterator vIterator; for (vIterator = v.begin(); vIterator != v.end(); vIterator++) { cout << *vIterator << " "; } cout << endl; }
(3)sort(),reverse()
void SortAndReverse() { vectormyVector; myVector.push_back(2); myVector.push_back(9); myVector.push_back(1); myVector.push_back(0); myVector.push_back(7); cout << "排序前的序列:"; PrintVector(myVector); sort(myVector.begin(), myVector.end()); cout << "升序排序後的序列:"; PrintVector(myVector); reverse(myVector.begin(), myVector.end()); cout << "降序排序後的序列:"; PrintVector(myVector); }
(4)find()
void FindVector() { vectormyVector; myVector.push_back(2); myVector.push_back(4); myVector.push_back(6); myVector.push_back(8); myVector.push_back(0); vector ::iterator vIterator; vIterator = find(myVector.begin(), myVector.end(), 6); if (vIterator == myVector.end()) { cout << "未找到" << endl; } else { cout << "找到:" << *vIterator << endl; } }
(5)equal()
void EqualVector() { vectormyVector1; myVector1.push_back(1); myVector1.push_back(5); myVector1.push_back(7); myVector1.push_back(9); vector myVector2; myVector2.push_back(1); myVector2.push_back(5); myVector2.push_back(7); myVector2.push_back(9); bool isEqual = equal(myVector1.begin(), myVector1.end(), myVector2.begin()); if (isEqual) { cout << "相等" << endl; } else { cout << "不相等" << endl; } }
(6)merge()
void MergeVector() { vectormyVector1; myVector1.push_back(1); myVector1.push_back(5); myVector1.push_back(7); myVector1.push_back(9); vector myVector2; myVector2.push_back(2); myVector2.push_back(3); myVector2.push_back(4); myVector2.push_back(5); // 需要在合並前排序 sort(myVector1.begin(), myVector1.end()); sort(myVector2.begin(), myVector2.end()); // 需要指定結果集的大小 vector myResult(8); merge(myVector1.begin(), myVector1.end(), myVector2.begin(), myVector2.end(), myResult.begin()); cout << "合並後的序列為:"; PrintVector(myResult); }
(7)swap()
void SwapObject() { int i = 2; int j = 3; cout << "交換之前兩個數的值:"; cout << "i = " << i << ";j = " << j << endl; swap(i, j); cout << "交換之後兩個數的值:"; cout << "i = " << i << ";j = " << j << endl; }
swap可以用來交換兩個數。
(8)unique
// 去重的操作:sort-->unique-->erase // vector可以由數組進行初始化 void UniqueVector() { int array[] = {5, 3, 1, 3, 2, 5}; vectorvectorFromArray(array, array + sizeof(array) / sizeof(int)); sort(vectorFromArray.begin(), vectorFromArray.end()); vector ::iterator iter = unique(vectorFromArray.begin(), vectorFromArray.end()); vectorFromArray.erase(iter, vectorFromArray.end()); cout << "去重之後的序列:"; PrintVector(vectorFromArray); }
(9)replace()
void ReplaceVector() { int array[] = {2, 4, 6, 8, 9}; vectormyVector(array, array + sizeof(array) / sizeof(int)); cout << "替換之前的序列:"; PrintVector(myVector); replace(myVector.begin(), myVector.end(), 8, 888); cout << "替換之後的序列:"; PrintVector(myVector); }
(10)remove()
// 刪除操作和去重操作是類似的,實際使用remove的時候,並沒有刪除那個元素,而是用後面的那個 // 元素替代了想要刪除的元素。最後要使用erase方法刪除。 // 但是只能刪除第一次出現的那個數字,而第二個元素不可刪除。 void RemoveVector() { int array[] = {1, 2, 3, 4, 5}; vectormyVector(array, array + sizeof(array) / sizeof(int)); cout << "刪除元素前的序列:"; PrintVector(myVector); vector ::iterator Iter = remove(myVector.begin(), myVector.end(), 4); myVector.erase(Iter); cout << "刪除元素前的序列:"; PrintVector(myVector); }
(11)for-each()
// 遍歷序列中的每個元素,然後去執行某個方法 void ForEach() { int array[] = {3, 5, 7, 9, 1}; vectormyVector(array, array + sizeof(array) / sizeof(int)); cout << "for-each之前的序列:"; PrintVector(myVector); for_each(myVector.begin(), myVector.end(), PrintElement); cout << "for-each之後的序列:"; PrintVector(myVector); } // 傳引用,就可以改變原序列 void PrintElement(int &ele) { ele = ele * ele; }
for-each是對序列中的每個元素進行快速遍歷,然後在遍歷過程中對每個元素執行一定的操作,示例代碼中是對每個元素求平方,這樣就可以改變原序列。
(12)count()
void CountVector() { int array[] = {4, 4, 6, 9, 0, 0, 0}; vectormyVector(array, array + sizeof(array) / sizeof(int)); // 這裡默認返回的是long long num = count(myVector.begin(), myVector.end(), 0); cout << "某個值出現的次數為:" << num << endl; }
(13)copy()
void CopyVector() { int arr[] = {2, 3, 4, 5, 6}; vectormyVector(arr, arr + sizeof(arr) / sizeof(int)); // 這裡需要指定大小 vector myVectorCopy(5); copy(myVector.begin(), myVector.end(), myVectorCopy.begin()); cout << "拷貝後的序列為:"; PrintVector(myVectorCopy); }
(14)generate()
void GenerateVector() { vectormyVector(6); generate(myVector.begin(), myVector.end(), rand); cout << "生成的隨機序列為:"; PrintVector(myVector); }
(15)move()
void MoveVector() { int arr[] = {4, 6, 8, 2, 0}; vectormyVector(arr, arr + sizeof(arr) / sizeof(int)); vector myVectorMove(10); // 初始值為0 move(myVector.begin(), myVector.end(), myVectorMove.begin() + 5); cout << "移動後的序列為:"; PrintVector(myVectorMove); }
可以把序列向前或向後移動若干個位置,空位用0補。
(16)fill()
/** * vector的初始化可以用array,也可以直接用{}. */ void FillVector() { vectormyVector{3, 4, 5, 6, 7}; cout << "初始的序列為:"; PrintVector(myVector); // 數據全部填充為** fill(myVector.begin(), myVector.end(), 99); cout << "填充後的序列為:"; PrintVector(myVector); }
(17)rotate()
// rorate函數將[first, middle)內的元素和[middle, last)內的元素互換,middle所指元素成為容器的第一個元素。 void RotateVector() { vectormyVector{4, 5, 0, 1, 9}; cout << "旋轉前的序列為:"; PrintVector(myVector); rotate(myVector.begin(), myVector.begin() + 3, myVector.end()); cout << "旋轉後的序列為:"; PrintVector(myVector); }
(18)關於堆的操作
// 關於堆的操作 void Heap() { int arr[] = {3, 7, 9, 1, 0, 6}; vectormyVector(arr, arr + sizeof(arr) / sizeof(int)); // 建立一個最大堆,第三個參數less為最大堆,greater為最小堆;默認為最大堆; make_heap(myVector.begin(), myVector.end(),less ()); PrintVector(myVector); // 新添加一個元素在末尾,然後重新調整堆序。也就是把元素添加在底層vector的end處。 // 要先在容器中加入數據,再調用push_heap; myVector.push_back(99); push_heap(myVector.begin(), myVector.end()); PrintVector(myVector); // 把堆頂元素取出來,放到數組或者是vector的末尾,用原來末尾元素去替代。 // 要先調用pop_heap,再到容器中刪除數據; pop_heap(myVector.begin(), myVector.end()); myVector.pop_back(); PrintVector(myVector); // 排序之後就不是一個合法的堆了 sort_heap(myVector.begin(), myVector.end()); PrintVector(myVector); }
好好掌握STL的函數庫調用,可以大大提高編程效率和能力。對一些算法題的解決也會有更好的思路。