大多重載的算法都同時有兩個版本的:算法
iterator min_element(iterator first, iterator last);
iterator min_element(iterator first, iterator last,Pred op);
複製代碼
STL中的算法大體有如下7種:bash
須要說明的是,算法名字並不表明實際意義,能夠用本身的想象力作算法名字以外的事情;同時有些很是用算法並未列出dom
該類算法不修改算法所做用的容器或對象函數
適用於順序容器和關聯容器性能
時間複雜度都是O(n)測試
經常使用算法:ui
名稱 | 說明(代碼爲函數模板,InIt表明迭代器,簡單的不說明) |
---|---|
find | InIt find(InIt first, InIt last, const T& val); |
count | size_t count(InIt first, InIt last, const T& val); |
min | |
max | |
min_element | FwdIt min_element(FwdIt first, FwdIt last); |
max_element | FwdIt max_element(FwdIt first, FwdIt last); |
search | 查找另外一區間第一次出現的位置 |
find_first_of | |
find_end | |
equal | 判斷兩區間是否相等 |
for_each | Fun for_each(InIt first, InIt last, Fun f); |
會修改源區間或目標區間元素的值spa
值被修改的那個區間不能夠是關聯容器(關聯容器會涉及到從新排序)code
經常使用算法:orm
名稱 | 說明(Init輸入迭代器,OutIt輸出迭代器) |
---|---|
for_each | |
copy | OutIt copy(InIt first, InIt last, OutIt x); |
copy_backward | |
transform | OutIt transform(InIt first, InIt last, OutIt x, Unop uop); |
swap_ranges | |
fill | |
fill_n | |
generate | |
generate_n | |
replace | |
replace_if | |
replace_copy | |
replace_copy_if |
刪除一個容器中的某些元素
刪除算法不該做用於關聯容器(關聯容器會涉及到元素排序)
算法複雜度都是o(n)
刪除並不會使元素減小
* 將全部應該被刪除的元素看作空位子
* 用留下的元素從後往前移, 依次去填空位子
* 空位置填滿後,剩下的位置由剛開始的所在位置元素填(即剩下的位置不變)
複製代碼
名稱 | 說明 |
---|---|
remove | 刪除區間中等於某個值的元素 |
unique | 刪除區間中連續相等的元素, 只留下一個(可自定義比較器) |
remove_if | |
remove_copy | |
remove_copy_if | |
unique_copy |
變序算法改變容器中元素的順序,可是不改變元素的值
變序算法不適用於關聯容器
算法複雜度都是O(n)的
名稱 | 說明(FwdIt迭代器) |
---|---|
reverse | 顛倒區間的先後次序 |
rotate | 將區間進行循環左移 |
next_permutation | 將區間改成下一個排列(可自定義比較器) |
prev_permutation | 將區間改成上一個排列(可自定義比較器) |
random_shuffle | 隨機打亂區間內元素的順序 |
stable_patition | 把區間內知足某個條件的元素移到前面,不知足該條件的移到後面,而對這兩部分元素, 分別保持它們原來的前後次序不變 |
partition | 把區間內知足某個條件的元素移到前面,不知足該條件的移到後面 |
rotate_copy | 將區間以首尾相接的形式進行旋轉後的結果拷貝到另外一個區間,源區間不變 |
reverse_copy | 把一個區間顛倒後的結果拷貝到另外一個區間,源區間不變 |
排序算法須要隨機訪問迭代器的支持
不適用於關聯容器和list
比前面的變序算法複雜度更高, 通常是O(nlog(n))
名稱 | 說明(RanIt迭代器) |
---|---|
sort | void sort(RanIt first, RanIt last, Pred pr) |
stable_sort | |
partial_sort | |
partial_sort_copy | |
nth_element | |
make_heap | |
push_heap | |
pop_heap | |
sort_heap |
sort 其實是快速排序, 時間複雜度 O(n*log(n))
若是要保證 「最壞狀況下」 的性能, 那麼可使用stable_sort
排序算法要求隨機存取迭代器的支持, 因此list不能使用排序算法, 要使用list自帶的sort成員函數list::sort。
要求所操做的區間是已經從小到大排好序的
須要隨機訪問迭代器的支持
有序區間算法不能用於關聯容器和list
名稱 | 說明(前6個很經常使用) |
---|---|
binary_search | 判斷區間中是否包含某個元素(折半查找) |
includes | 判斷是否一個區間中的每一個元素,都在另外一個區間中 |
lower_bound | 查找最後一個不小於某值的元素的位置 |
upper_bound | 查找第一個大於某值的元素的位置 |
equal_range | 同時獲取lower_bound和upper_bound |
merge | 合併兩個有序區間到第三個區間 |
set_union | 將兩個有序區間的並拷貝到第三個區間 |
set_intersection | 將兩個有序區間的交拷貝到第三個區間 |
set_difference | 將兩個有序區間的差拷貝到第三個區間 |
set_symmetric_difference | 將兩個有序區間的對稱差拷貝到第三個區間 |
inplace_merge | 將兩個連續的有序區間原地合併爲一個有序區間 |
bitset一個實際上不屬於STL算法,可是會很經常使用。
template<size_t N>
class bitset{
...
}
bitset<40>bst; #bst是一個由40位組成的對象,用bitset的函數能夠方便地訪問任何一位
複製代碼
bitset的成員函數:
bitset<N>& operator&=(const bitset<N>& rhs);
bitset<N>& operator|=(const bitset<N>& rhs);
bitset<N>& operator^=(const bitset<N>& rhs);
bitset<N>& operator<<=(size_t num);
bitset<N>& operator>>=(size_t num);
bitset<N>& set(); //所有設成1
bitset<N>& set(size_t pos, bool val = true); //設置某位
bitset<N>& reset(); //所有設成0
bitset<N>& reset(size_t pos); //某位設成0
bitset<N>& flip(); //所有翻轉
bitset<N>& flip(size_t pos); //翻轉某位
reference operator[](size_t pos); //返回對某位的引用
bool operator[](size_t pos) const; //判斷某位是否爲1
reference at(size_t pos);
bool at(size_t pos) const;
unsigned long to_ulong() const; //轉換成整數
string to_string() const; //轉換成字符串
size_t count() const; //計算1的個數
size_t size() const;
bool operator==(const bitset<N>& rhs) const;
bool operator!=(const bitset<N>& rhs) const;
bool test(size_t pos) const; //測試某位是否爲 1
bool any() const; //是否有某位爲1
bool none() const; //是否所有爲0
bitset<N> operator<<(size_t pos) const;
bitset<N> operator>>(size_t pos) const;
bitset<N> operator~();
static const size_t bitset_size = N;
#注意: 第0位在最右邊
複製代碼
總結起來呢,就是實現容器或對象元素的查刪改比較排序。