STL知識點。梗概。<一>
------《標準模板庫自修教程與參考手冊 STL進行C++編程》------
STL的6大組件:容器、類屬演算法、迭代器、函數對象、適配器、分配器。
---------------------------------------------------------------------------------------------
迭代器:
迭代器是類似指標的對象,STL演算法利用它們對儲存在容器中的對象序列進行遍曆。
5種類別:1、輸入迭代器 ::iterator istream_iterator< >輸入資料流迭代器
2、輸出迭代器 ::iterator ostream_iterator< >輸出資料流迭代器
3、前向迭代器 ::iterator 既是輸入也是輸出迭代器
4、雙向迭代器 ::iterator 支援前向迭代器的所有操作還需能進行反向遍曆
5、隨機訪問迭代器 ::iterator 對序列中間元素的訪問必須具有常量的時間複雜度
要求隨機訪問迭代器支援雙向迭代器的所有操作,此外還要求支援(其中r和s分別是隨機訪問迭代器,n是整數運算式)
:對整數的加法和減法,以r+n, n+r 和 r-n表示
:使用運算式r[n]訪問第n個元素,其含義為*(r+n)
:雙向“跳轉”,以r+=n和r-=n表示
:迭代器減法,以r-s表示,其結果為整數值
:比較以r<s,r>s,r<=s和r>=s表示,其結果為布爾值
插入迭代器:- back_insert_iterator<Container> 使用Container的push_back成員函數
- front_insert_iterator<Container> 使用Container的push_front成員函數
- insert_iterator<Container> 使用Container的insert成員函數
--------------------------------------------------------------------------------------------
類屬演算法:
類屬演算法分為1、非可變序列演算法 2、可變序列演算法 3、排序相關演算法 4、通用數值演算法
1、非可變序列演算法:指不直接修改其所操作的容器內容的演算法。
find : Locates the position of the first occurrence of an element in a range that has a specified value.(尋找序列中第一個出現的給定值的位置)。它的判斷函數的形式是 find_if : 尋找序列中第一個使給定的判斷函數返回真的元素。find和find_if具有線性時間複雜度。
adjacent_find : Searches for two adjacent elements that are either equal or satisfy a specified condition.(尋找在序列中相鄰且相等或者滿足指定條件的兩個元素)此演算法返回指向兩個元素中第一個元素的迭代器。adjacent_find具有線性時間複雜度。
count : Counts the number of elements in the range [First, Last +1) that match Value and returns the number of matching elements.(計算[First,Last+1)區間內與Value相匹配的對象的數目並作為傳回值返回(相匹配元素的個數))。它的一元判斷函數形式是 count_if : 滿足給定條件的元素的個數。count和count_if具有線性時間複雜度。
for_each : Applies a specified function object to each element in a forward order within a range and returns the function object.對序列中指定範圍內的每個元素施加由指定函數指定的操作。返回函數對象拷貝。for_each具有線性時間複雜度。
mismatch : Compares two ranges element by element either for equality or equivalent in a sense specified by a binary predicate and locates the first position where a difference occurs.比較容器中兩個區間的元素。返回位置。詳見書p63。具有線性時間複雜度。
equal : Compares two ranges element by element either for equality or equivalence in a sense specified by a binary predicate.比較容器中兩個區間的元素。返回真或假。詳見書p63。具有線性時間複雜度。
search : Searches for the first occurrence of a sequence within a target range whose elements are equal to those in a given sequence of elements or whose elements are equivalent in a sense specified by a binary predicate to the elements in the given sequence. 給定兩個迭代器區間,將後一個區間內的對象作為一個子序列,並在前一個區間內尋找出現該子序列的第1個位置。它是對字串匹配函數的推廣,比如C的庫函數strstr。
--------------------------------------------------------------------------------------------
2、可變序列演算法:可以修改它們所操作的容器內容的演算法。
copy : Assigns the values of elements from a source range to a destination range, iterating through the source sequence of elements and assigning them new positions in a forward direction.將容器中的元素從一個區間複製到另一個區間。copy(first1, last1, first2) 進行的是前向處理。
copy_backward : Assigns the values of elements from a source range to a destination range, iterating through the source sequence of elements and assigning them new positions in a backward direction.同copy,copy_backward(first1, last1, last2)。但是進行的是後向處理。
fill : Assigns the same new value to every element in a specified range. 把某個值複製到某一區間的所有位置中。fill(first, last, value)把value的last-first個副本放入區間[first, last)中。fill_n(first, n, value)把value的n個副本放到區間[first, first+n)中。
generate : Assigns the values generated by a function object to each element in a range.連續調用gen函數(該函數時generate演算法的第三個參數)last-first次,並用該函數的這些傳回值來填充區間[first,last)。這裡假定gen是不帶參數的函數。具有線性時間複雜度。
partition : Classifies elements in a range into two disjoint sets, with those elements satisfying a unary predicate preceding those that fail to satisfy it.對於給定的區間[first,last)和一個一元判斷函數pred,類屬演算法partition可以對該區間內的元素重新排列,以使所有滿足判斷函數pred的元素排在所有不滿足pred的元素前面。該演算法還有一個版本stable_partition,能保證分割後的每一組中元素的相對位置保持不變。它們的傳回值都是一個迭代器,該迭代器代表第一組資料的結尾,同時也是第二組資料的開頭。都具有線性時間複雜度。
random_shuffle : Rearranges a sequence of N elements in a range into one of N! possible arrangements selected at random.利用能夠產生偽隨機數的函數,對區間[first,last)中的元素混洗順序後重新排列。產生的排列結果近似於均勻分布。還有一種形式:有3個參數,其中第3個參數是一個函數,通過該函數,可以為演算法提供不同的隨機數發生器。這個隨機數發生器函數的參數是一個整數N,其傳回值是在區間[0,N)內隨機選取的整數。具有線性時間複雜度。
remove : Eliminates a specified value from a given range without disturbing the order of the remaining elements and returning the end of a new range free of the specified value.從一個區間中刪除所有等於某個特定值的元素。該演算法是穩定的,它可以保持從序列中刪除元素後剩下元素之間的相對位置不變。remove並不改變它操作的容器大小。remove演算法也有複製形式和判斷函數形式。該演算法的所有形式都具有線性時間複雜度。
replace : Examines each element in a range and replaces it if it matches a specified value.把一個區間中所有等於某個特定值得元素用另一個值替換。replace演算法也有複製形式和判斷函數形式。該演算法的所有形式都具有線性時間複雜度。
reverse : Reverses the order of the elements within a range.倒轉一個區間中元素的排列順序。用來指定區間的迭代器必須是雙向迭代器。具有線性時間複雜度。
rotate : Exchanges the elements in two adjacent ranges.對區間內的元素進行迴圈移位操作。rotate(first, middle, last)表示將區間[first, last)內的元素迴圈左移middle-first個位置。函數返回後,原來區間[middle,last)中的元素將出現在區間[first,first+k)中,其中k=last-middle;而原來在區間[first,middle)中的元素將出現在區間[first+k,last)中。rotate演算法的參數必須是雙向迭代器。具有線性時間複雜度。
swap : Exchanges the values of the elements between two types of objects, assigning the contents of the first object to the second object and the contents of the second to the first.對兩個值進行交換。具有常量的時間複雜度。
swap_ranges : Exchanges the elements of one range with the elements of another, equal sized range.交換兩個區間中的值,而且這兩個區間可以在不同的容器中。swap_ranges(first1, last1, first2)此語句將區間[first1,last1)和區間[first2,first2+N)中的內容相互交換,其中N=last1-first1。這兩個區間不可以重疊。
transform : Applies a specified function object to each element in a source range or to a pair of elements from two source ranges and copies the return values of the function object into a destination range.將某個函數作用到某一區間內的每個元素上,並將該函數所返回的結果儲存到另一個區間中。該演算法有兩種形式:一種採用的是一元函數,作用到區間中的每個元素上;另一種採用的是二元函數,同時作用到兩個區間中相互對應的元素上。
unique : Removes duplicate elements that are adjacent to each other in a specified range.從輸入序列中去掉所有相鄰的重複元素。如果序列中的某個元素與其左面的相鄰元素相等,則稱該元素為相鄰重複元素(注意,這裡的相鄰重複元素不是指兩個相鄰且相等的元素,而是指兩個或兩個以上相鄰且相等的元素中除最左邊元素以外的那些元素)。unique演算法並不改變它操作的容器的大小,而只是把相鄰重複元素之外的其他元素複製到一個較小的區間中,並返回指向該區間末尾的迭代器。具有線性時間複雜度。
--------------------------------------------------------------------------------------------
3、排序相關演算法:包括對序列進行排序和合并的演算法、搜尋演算法以及有序序列上的集合操作。
sort : 對隨機訪問序列排序,排序結果仍然儲存在操作的容器中。需要對數的額外儲存空間。不要求是穩定的。就是說演算法不需要保持相等元素的相對位置。
stable_sort : 對隨機訪問序列排序,排序結果仍然儲存在操作的容器中。需要線性額外儲存空間。要求是穩定的。
partial_sort : 對隨機訪問序列排序,排序結果仍然儲存在操作的容器中。所需要的額外儲存空間是常量。不要求是穩定的。
nth_element : 在序列的第N個位置存放一個元素,該位置和該元素所滿足的條件是:如果序列是有序的,則該元素就應處於該位置。此外,nth_element演算法還對序列實現了分割,即所有第N個元素左邊的元素都小於或等於其右邊的元素。
binary_search、lower_bound、upper_bound、equal_range : 採用傳統的二分尋找方法在有序序列中尋找元素.對於給定的有序區間[first,last)和元素x,如果在該區間中存在某個元素等於x,則類屬演算法binary_search返回真,否則返回假。lower_bound和upper_bound演算法的輸入和binary_search演算法的輸入相同,但它們各返回一個迭代器i,這兩個迭代器指向的位置分別表示在保持序列有序的情況下,可以向序列中插入元素x的第1個和最後一個位置(注意,不管區間中是否已存在等於x的元素,上面的定義都可以決定x在區間中的位置)。equal_range演算法的傳回值是兩個迭代器,它們和lower_bound和upper_bound所返回的一對迭代器是一樣的。
merge : 合并兩個有序區間,並把結果儲存到另一個和兩個輸入區間均不重疊的區間中。inplace_merge演算法的作用是合并兩個相鄰的有序區間,並用合并後的序列代替兩個輸入區間中原來的序列。
集合操作和有序結構:
includes : 檢查區間[first1,last1)中的元素是否包含在另一個區間[first2,last2)中,並根據結果返回一個布爾值。
set_union : 對於給定的兩個代表集合的區間[first1,last1)和[first2,last2),產生這兩個集合的並集,其結果儲存在區間[result,last)中,並返回last,即結果序列的尾後繼值迭代器。
set_intersection : 得到兩個輸入序列的交集。
set_difference : 得到一個集合,該集合中的元素屬於第1個區間,但不屬於第2個區間。
set_symmetric_difference : 得到一個集合,該集合中的元素僅屬於兩個輸入序列中的一個,而不包括兩個輸入區間的交集中的元素。和set_union演算法一樣,所有這些集合操作演算法也把結果儲存在區間[result,last)中,並且返回結果序列的尾後繼值迭代器last.
堆操作:
堆代表了對隨機訪問資料結構的一種特殊組織方式。給定一個區間[first,last),如果滿足下面兩個特點,則稱該區間為一個堆:
* first所指向的元素是區間中的最大元素。
* 可以通過pop操作刪除first所指向的元素,也可以通過push操作向序列中插入元素。這兩種操作的時間複雜度都是對數的,而且pop和push操作所返回的仍然為一個堆。
make_heap : 利用區間[first,last)中的元素構造一個堆,並把結果儲存在區間[first,last)中。
pop_heap : 假定區間[first,last)中已經包含了一個堆,該演算法的作用是將first位置上的值和last-1位置上的值交換,然後把區間[first,last-1)調整為一個堆。
push_heap : 假定區間[first,last-1)中已經包含了一個堆,該演算法的作用是把區間[first,last)再重新調整為一個堆(從而把last-1位置上的元素壓入堆中)。
sort_heap : 對儲存在堆中的元素進行排序。
最小值和最大值:
min : 以兩個元素作為參數,返回兩個元素中較小的元素。min_element返回指向輸入序列中最小元素的迭代器。
max : 以兩個元素作為參數,返回兩個元素中較大的元素。max_element返回指向輸入序列中最大元素的迭代器。
詞典序比較:
lexicographical_compare : 用下面兩個方法對兩個輸入序列進行排序 : 首先,該演算法比較兩個序列中的對應元素e1和e2(分別來自序列1和序列2)。如果e1<e2,則演算法立即返回,傳回值為真;如果e2<e1,則演算法也立即返回,傳回值為假;否則繼續對下一對元素進行比較。如果已到達第1個序列的末尾,但沒有到達第2個序列的末尾,則演算法返回,傳回值為真;否則返回假。定義在序列元素上的<運算子必須是嚴格弱序(也可以將定義為嚴格弱序的比較對象作為參數傳遞給lexicographical_compare)。如果<或比較對象所定義的比較關係是一個嚴格全序,則由lexicographical_compare所決定的比較關係也是一個嚴格全序;否則,該比較關係是嚴格弱序。
排列產生器:
next_permutation : 按詞典序將序列變換為下一個排列。輸入序列必須支援雙向迭代器。
prev_permutation : 按詞典序將序列變換為前一個排列。輸入序列必須支援雙向迭代器。
--------------------------------------------------------------------------------------------
4、通用數值演算法:
accumulate : 計算給定區間中值的累加和。
partial_sum : 對於給定的序列x0,x1,...,x(n-1),計算和的序列x0,x0+x1,x0+x1+x2,...+x(n-1)。該演算法可以把這些部分和儲存在原序列中,也可以儲存在另一個區間中。
adjacent_difference : 對於給定的序列x0,x1,...,x(n-1),計算序列中相鄰兩個元素的差序列x1-x0,x2-x1,...,x(n-1)-x(n-2)。該演算法可以把結果序列儲存在原序列中,也可以儲存在另一個區間中。
inner_product : 計算兩個輸入序列的內積(inner product)。在下面的樣本程式中,首先使用通常的基於+和*運算的內積定義計算了序列1,2,3,4,5和2,3,4,5,6的內積。即:1*2+2*3+3*4+4*5+5*6==70。預設情況下,inner_product演算法使用+和*運算子。但是通過把函數對象作為參數傳遞給inner_product,也可以使用其它運算子