函數原型:
template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
函數做用:
將[first,last)區間的元素拷貝至result開頭的迭代器區間,並返回賦值之後的result。
copy_n
函數原型:
template <class InputIterator, class Size, class OutputIterator>
OutputIterator copy_n (InputIterator first, Size n, OutputIterator result);
函數做用:
從first的迭代器位置開始,拷貝n個元素至result開頭的迭代器序列,從函數實現來看,該函數未保證必定不越界,調用者要本身判斷n的大小。
copy_if
函數原型:
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred);
函數做用:
將[first,last)區間傳入pred,另pred返回true的元素將被拷貝至result開始的迭代器序列。
copy_backward
函數原型:
template <class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward (BidirectionalIterator1 first, BidirectionalIterator1 last,BidirectionalIterator2 result);
函數做用:
打個比方,copy是穿上衣,copy_backward就是穿褲子。
最終返回的result指向result序列的開始,非結束位置。
這個函數是什麼意思呢?和copy都有哪些不同的應用場合?
move
函數原型:
template <class InputIterator, class OutputIterator>
OutputIterator move (InputIterator first, InputIterator last, OutputIterator result);
函數做用:
像文件mv操做同樣,將[first,last)之間的元素拷貝至result開頭的迭代器序列。從vs2010的STL源碼來看,沒有找到對容量進行檢測的,調用者須要保證result的空間足夠。
move_backward
函數原型:
template <class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 move_backward (BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result);
函數做用:
倒着mv並返回result,此時的result是mv後的元素的迭代器序列開始。調用者保證result的空間。
swap
函數原型:
template <class T> void swap (T& a, T& b)
noexcept (is_nothrow_move_constructible<T>::value && is_nothrow_move_assignable<T>::value);
template <class T, size_t N> void swap(T (&a)[N], T (&b)[N])
noexcept (noexcept(swap(*a,*b)));
函數做用:
將a與b互換,或者a的數組和b的數組互換,若是是數組互換,要指定下標而且下標保持一致。
swap_ranges
函數原型:
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
函數做用:
將[first1,last1)區間的元素與first2開始的區間的元素進行互換,調用者要保證first2的元素足夠多。
iter_swap
函數原型:
template <class ForwardIterator1, class ForwardIterator2>
void iter_swap (ForwardIterator1 a, ForwardIterator2 b);
函數做用:
適用於指針或迭代器,交換的是指向的元素,即*a和*b。
transform
函數原型:
template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform (InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperation op);
template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
OutputIterator transform (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result,BinaryOperation binary_op);
函數做用:
第一種實現,將[first1,last1)區間的元素傳給op函數進行處理,將op函數返回值記錄在result開頭的迭代器序列中,返回的result是迭代器序列的end。
第二種實現,將[first1,last1)區間和first2開頭的區間的元素傳遞給binary_op(*first1++,*first2++),binary_op函數的返回值記錄在result開頭的迭代器序列中,返回的result是迭代器序列的end。
如上二者都是對迭代器序列進行op處理,處理以後的元素保存在result中,就是轉換。
replace
函數原型:
template <class ForwardIterator, class T>
void replace (ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
函數做用:
將迭代器區間內元素值等於old_value的從新賦值爲new_value。
replace_if
函數原型:
template <class ForwardIterator, class UnaryPredicate, class T>
void replace_if (ForwardIterator first, ForwardIterator last, UnaryPredicate pred, const T& new_value );
函數做用:
和replace聯繫起來就很好理解了,將迭代器區間元素的值傳入pred,另pred返回ture的元素將被賦值爲new_value。
replace_copy
函數原型:
template <class InputIterator, class OutputIterator, class T>
OutputIterator replace_copy (InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value);
函數做用:
拿一塊兒理解容易混淆,將做用分開理解的話會好一些
第一個做用:將[first,last)區間的元素拷貝至result開頭的迭代器區間。
第二個做用:對result開頭的迭代器區間執行replace。
返回值的result是拷貝區間的end。
replace_copy_if
函數原型:
template <class InputIterator, class OutputIterator, class UnaryPredicate, class T>
OutputIterator replace_copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred, const T& new_value);
函數做用:
和replace_copy結合起來理解,第一個做用是同樣的,第二個做用是對result開頭的迭代器區間執行replace_if。
返回值的result是拷貝區間的end。
fill
函數原型:
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
函數做用:
太好理解了,遍歷&賦值
fill_n
函數原型:
template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val);
函數做用:
遍歷n個元素進行賦值,調用者保證first的size足夠。
generate
函數原型:
template <class ForwardIterator, class Generator>
void generate (ForwardIterator first, ForwardIterator last, Generator gen);
函數做用:
相似fill函數,將區間的元素賦值爲gen的返回值,gen爲無參函數。
generate_n
函數原型:
template <class OutputIterator, class Size, class Generator>
OutputIterator generate_n (OutputIterator first, Size n, Generator gen);
函數做用:
相似於fill_n,賦值n個元素爲gen的返回值,gen爲無參函數。
remove
函數原型:
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
函數做用:
將迭代器區間值等於val的元素刪除掉,並返回迭代器區間的new end。
remove_if
函數原型:
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last, UnaryPredicate pred);
函數做用:
相似remove,令pred(*first++)返回true的元素將被刪掉,並返回迭代器區間的new end。
remove_copy
函數原型:
template <class InputIterator, class OutputIterator, class T>
OutputIterator remove_copy (InputIterator first, InputIterator last, OutputIterator result, const T& val);
函數做用:
將[first,last)區間值不等於val的元素拷貝至result開頭的迭代器區間,並返回result迭代器區間的new end。
remove_copy_if
函數原型:
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator remove_copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred);
函數做用:
和remove_copy結合理解,全部令pred(*first++)返回值不等於true的將被拷貝至result開頭的迭代器區間,返回值是result開頭的迭代器區間的new end。
unique
函數原型:
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
函數做用:
將迭代器序列中相鄰的重複元素刪除掉(重複的元素只留下一個),第二個重載就是將pred(*first,*first++)返回true的元素刪除掉,返回值是迭代器序列的new end。
把函數名稱理解成去相鄰重複更好。 函數
unique_copy
函數原型:
template <class InputIterator, class OutputIterator>
OutputIterator unique_copy (InputIterator first, InputIterator last, OutputIterator result);
template <class InputIterator, class OutputIterator, class BinaryPredicate>
OutputIterator unique_copy (InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
函數做用:
將[first,last)序列中相鄰的非重複元素(相鄰不相等或pred(*first,*first++)返回false)拷貝至result開頭的迭代器區間,返回result開頭的迭代器區間的new end。
reverse
函數原型:
emplate <class BidirectionalIterator>
void reverse (BidirectionalIterator first, BidirectionalIterator last);
函數做用:
將迭代器區間的元素倒置。
reverse_copy
函數原型:
template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy (BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
函數做用:
將[first,last)區間的元素倒序複製到result開頭的區間,函數返回result開頭的迭代器區間的new end。
rotate
函數原型:
template <class ForwardIterator>
ForwardIterator rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last);
函數做用:
說是旋轉,其實否則,就是將middle以及後面的元素拷貝至開頭,本來在前面的元素拷貝至最後。
123456789 middle設置爲4,翻轉後結果是456789123.
rotate_copy
函數原型:
template <class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy (ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
函數做用:
1.
拷貝middle-last之間的元素至result
2.
拷貝first-middle之間的元素只result
返回值是result區間的new end。
random_shuffle
函數原型:
template <class RandomAccessIterator>
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator&& gen);
函數做用:
從新排列迭代器區間的元素。第二個重載版本用gen做爲隨機的規則。
shuffle
函數原型:
template <class RandomAccessIterator, class URNG>
void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);
函數做用:
隨機從新排列迭代器區間的元素,可是比較複雜,用到了random中的生成器,若是沒要求的話,用random_shuffle的第一個重載版本就能夠。
第三章:暢想學習
C++11中新增的STL算法函數並非必不可少的,也不是超級複雜須要極高水平才能實現的,也沒有對系統進行封裝提煉的,由於C++的基本功能已經很完善了,甚至說超級複雜了,C++11着眼於提升程序員的開發效率,提供程序員可重用的輪子,事實上這裏的大多數函數均可以用10行之內的代碼實現一個非模板函數的版本,C++11的這種轉變是一種使人欣喜的改變,希望更多C++coder能掌握C++11.spa