STL算法學習

STL算法學習,小結如下:

一   函數對象: 因爲很多的算法中多使用了函數對象


二元函數對象,V1和V2爲輸入,V3爲結果

plus<T>:
  transform(V1.begin(), V1.end(), V2.begin(), V3.begin(),plus<double>());

其他的二元函數對象:minus,multiples,divieds,modulus.

二元斷言函數對象,使用時需要bind2nd()或bind1st()來綁定比較對象。

less<T>:
  find_if(L.begin(), L.end(), bind2nd(less<int>(), 0));

其他的二元斷言函數:equal_to,notequal_to,greater,greater_equal,less_equal,logical_and,logical_or

二元邏輯函數

binary_negate:
const char* wptr = find_if(str, str + MAXLEN,
                           compose2(not2(logical_or<bool>()),
                                    bind2nd(equal_to<char>(), ' '),
                                    bind2nd(equal_to<char>(), '/n')));

一元函數對象

negate:
transform(V1.begin(), V1.end(), V2.begin(),
          negate<int>());

一元斷定函數對象

logical_not:
  transform(V.begin(), V.end(), V.begin(), logical_not<bool>());

一元邏輯函數

unary_negate:


二   函數對象發生器:主要用來填充序列。

產生不重複的隨機數:

三 函數對象適配器 : 將函數轉化爲函數對象

ptr_fun:一般函數適配器

一元實例:


二元實例:


not1:對一元的斷定函數對象取反的適配器。

not2: 對二元的斷定函數對象取反的適配器。

mem_fun與mem_fun_ref:類成員函數的適配器,區別是一個需要指針,而另一個僅需要一般對象。如下:
shape是一個指針變量,則foreach(v.begin(),v.end(),mem_fun(&shape::draw));
但如果shape是一般的變量,不是指針,則foreach(v.begin(),v.end(),mem_fun_ref(&shape::draw));

四   算法:

拷貝:
copy()
reverse_copy()
rotate_copy()
remove_copy()  拷貝不等於某值的元素到另一個序列。
remove_copy_if() 拷貝符合條件的到另一個序列。

填充和生成:
fill()
fill_n() 填充序列中的n個元素。
generate()爲序列中的每個元素調用gen()函數。

排列:
next_permuttion() 後一個排列。
prev_permutation()

partition() 劃分,將滿足條件的元素移動到序列的前面。
stable_partition()

查找和替換:
find()
binary_search() 在一個已經有順序的序列上查找。
find_if()
search() 檢查第二個序列是否在第一個序列中出現,且順序相同。

刪除:注意必須調用erase()來真正刪除
remove()
unique()刪除相鄰重複元素,最好現排序。

合併序列:
merge()

數值算法:
accumulate() 對序列的每個元素進行運算後求和。
transform() 也可以對每個元素進行運算。
計數:
size()總個數。
count()等於某值的元素個數。

adjacent_difference 序列中的後一個減前與他相鄰的前一個得到新的序列。

adiacent_find

五   所有的算法:

     accumlate iterator 對標誌的序列中的元素之和,加到一個由 init 指定的初始值上。重載的版本不再做加法,而是傳進來的二元操作符被應用到元素上。
adjacent_different
:創建一個新序列,該序列的每個新值都代表了當前元素與上一個元素的差。重載版本用指定的二元操作計算相鄰元素的差。
adjacent_find
:在 iterator 對標誌的元素範圍內,查找一對相鄰的重複元素,如果找到返回一個 ForwardIterator ,指向這對元素的第一個元素。否則返回 last 。重載版本使用輸入的二元操作符代替相等的判斷。
binary_search
:在有序序列中查找 value ,如果找到返回 true 。重載的版本使用指定的比較函數對象或者函數指針來判斷相等。
copy
:複製序列。
copy_backward
:除了元素以相反的順序被拷貝外,別的和 copy 相同。
count
:利用等於操作符,把標誌範圍類的元素與輸入的值進行比較,並返回相等元素的個數。
count_if
:對於標誌範圍內的元素,應用輸入的操作符,並返回結果爲 true 的次數。 具體參見http://blog.csdn.net/jinjingwen/archive/2011/03/08/6231975.aspx
equal
:如果兩個序列在範圍內的元素都相等,則 equal 返回 true 。重載版本使用輸入的操作符代替了默認的等於操作符。
equal_range
:返回一對 iterator ,第一個 iterator 表示由 lower_bound 返回的 iterator ,第二個表示由 upper_bound 返回的 iterator 值。
fill
:將輸入的值的拷貝賦給範圍內的每個元素。
fill_n
:將輸入的值賦值給 first frist+n 範圍內的元素。
find
:利用底層元素的等於操作符,對範圍內的元素與輸入的值進行比較。當匹配時,結束搜索,返回該元素的一個 InputIterator
find_if
:使用輸入的函數替代了等於操作符執行了 find
find_end
:在範圍內查找“由輸入的另外一個 iterator 對標誌的第二個序列”的最後一次出現。重載版本中使用了用戶輸入的操作符替代等於操作。
find_first_of
:在範圍內查找“由輸入的另外一個 iterator 對標誌的第二個序列”中的任意一個元素的第一次出現。重載版本中使用了用戶自定義的操作符。
for_each
:依次對範圍內的所有元素執行輸入的函數。三個參數的具體解釋爲:第一個參數和第二個參數是指定範圍的,如果是容器,就寫*.begin(),*.end()(*爲容器名字),如果是數組,就寫指針;第三個參數是調用函數的名字,就是說對於第一個參數和第二個參數指定範圍之中的每一個元素都會帶入到第三個參數指定的函數中去。
generate
:通過對輸入的函數 gen 的連續調用來填充指定的範圍。
generate_n
:填充 n 個元素。
includes
:判斷 [first1, last1) 的一個元素是否被包含在另外一個序列中。使用底層元素的 <= 操作符,重載版本使用用戶輸入的函數。
inner_product
:對兩個序列做內積 ( 對應的元素相乘,再求和 ) ,並將內積加到一個輸入的的初始值上。重載版本使用了用戶定義的操作。
inner_merge
:合併兩個排過序的連續序列,結果序列覆蓋了兩端範圍,重載版本使用輸入的操作進行排序。
iter_swap
:交換兩個 ForwardIterator 的值。
lexicographical_compare
:比較兩個序列。重載版本使用了用戶自定義的比較操作。
lower_bound
:返回一個 iterator ,它指向在範圍內的有序序列中可以插入指定值而不破壞容器順序的第一個位置。重載函數使用了自定義的比較操作。
max
:返回兩個元素中的較大的一個,重載版本使用了自定義的比較操作。
max_element
:返回一個 iterator ,指出序列中最大的元素。重載版本使用自定義的比較操作。
min
:兩個元素中的較小者。重載版本使用自定義的比較操作。
min_element
:類似與 max_element ,不過返回最小的元素。
merge
:合併兩個有序序列,並存放到另外一個序列中。重載版本使用自定義的比較。
mismatch
:並行的比較兩個序列,指出第一個不匹配的位置,它返回一對 iterator ,標誌第一個不匹配的元素位置。如果都匹配,返回每個容器的 last 。重載版本使用自定義的比較操作。
next_permutation
:取出當前範圍內的排列,並將其重新排序爲下一個排列。重載版本使用自定義的比較操作。
nth_element
:將範圍內的序列重新排序,使所有小於第 n 個元素的元素都出現在它前面,而大於它的都出現在後面,重載版本使用了自定義的比較操作。
partial_sort
:對整個序列做部分排序,被排序元素的個數正好可以被放到範圍內。重載版本使用自定義的比較操作。
partial_sort_copy
:與 partial_sort 相同,除了將經過排序的序列複製到另外一個容器。
partial_sum
:創建一個新的元素序列,其中每個元素的值代表了範圍內該位置之前所有元素之和。重載版本使用了自定義操作替代加法。
partition
:對範圍內元素重新排序,使用輸入的函數,把計算結果爲 true 的元素都放在結果爲 false 的元素之前。
prev_permutation
:取出範圍內的序列並將它重新排序爲上一個序列。如果不存在上一個序列則返回 false 。重載版本使用自定義的比較操作。
random_shuffle
:對範圍內的元素隨機調整次序。重載版本輸入一個隨機數產生操作。
remove
:刪除在範圍內的所有等於指定的元素,注意,該函數並不真正刪除元素。內置數組不適合使用 remove remove_if 函數。
remove_copy
:將所有不匹配的元素都複製到一個指定容器,返回的 OutputIterator 指向被拷貝的末元素的下一個位置。
remove_if
:刪除所有範圍內輸入操作結果爲 true 的元素。
remove_copy_if
:將所有不匹配的元素拷貝到一個指定容器。
replace
:將範圍內的所有等於 old_value 的元素都用 new_value 替代。
replace_copy
:與 replace 類似,不過將結果寫入另外一個容器。
replace_if
:將範圍內的所有操作結果爲 true 的元素用新值替代。
replace_copy_if
:類似與 replace_if ,不過將結果寫入另外一個容器。
reverse
:將範圍內元素重新按反序排列。
reverse_copy
:類似與 reverse ,不過將結果寫入另外一個容器。
rotate
:將範圍內的元素移到容器末尾,由 middle 指向的元素成爲容器第一個元素。
rotate_copy
:類似與 rotate ,不過將結果寫入另外一個容器。
search
:給出了兩個範圍,返回一個 iterator ,指向在範圍內第一次出現子序列的位置。重載版本使用自定義的比較操作。
search_n
:在範圍內查找 value 出現 n 次的子序列。重載版本使用自定義的比較操作。
set_difference
:構造一個排過序的序列,其中的元素出現在第一個序列中,但是不包含在第二個序列中。重載版本使用自定義的比較操作。
set_intersection
:構造一個排過序的序列,其中的元素在兩個序列中都存在。重載版本使用自定義的比較操作。
set_symmetric_difference
:構造一個排過序的序列,其中的元素在第一個序列中出現,但是不出現在第二個序列中。重載版本使用自定義的比較操作。
set_union
:構造一個排過序的序列,它包含兩個序列中的所有的不重複元素。重載版本使用自定義的比較操作。
sort
:以升序重新排列範圍內的元素,重載版本使用了自定義的比較操作。
stable_partition
:與 partition 類似,不過它不保證保留容器中的相對順序。
stable_sort
:類似與 sort ,不過保留相等元素之間的順序關係。
swap
:交換存儲在兩個對象中的值。
swap_range
:將在範圍內的元素與另外一個序列的元素值進行交換。
transform
:將輸入的操作作用在範圍內的每個元素上,併產生一個新的序列。重載版本將操作作用在一對元素上,另外一個元素來自輸入的另外一個序列。結果輸出到指定的容器。
unique
:清除序列中重複的元素,和 remove 類似,它也不能真正的刪除元素。重載版本使用了自定義的操作。
unique_copy
:類似與 unique ,不過它把結果輸出到另外一個容器。
upper_bound
:返回一個 iterator ,它指向在範圍內的有序序列中插入 value 而不破壞容器順序的最後一個位置,該位置標誌了一個大於 value 的值。重載版本使用了輸入的比較操作。
堆算法: C++ 標準庫提供的是 max-heap 。一共由以下 4 個泛型堆算法。
make_heap
:把範圍內的元素生成一個堆。重載版本使用自定義的比較操作。
pop_heap
:並不是真正的把最大元素從堆中彈出,而是重新排序堆。它把 first last-1 交換,然後重新做成一個堆。可以使用容器的 back 來訪問被“彈出“的元素或者使用 pop_back 來真正的刪除。重載版本使用自定義的比較操作。
push_heap
:假設 first last-1 是一個有效的堆,要被加入堆的元素在位置 last-1 ,重新生成堆。在指向該函數前,必須先把元素插入容器後。重載版本使用指定的比較。
sort_heap
:對範圍內的序列重新排序,它假設該序列是個有序的堆。重載版本使用自定義的比較操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章