日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL源码剖析 数值算法 heap算法

發布時間:2023/12/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL源码剖析 数值算法 heap算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法

  • adjacent_find
  • count
  • count_if
  • find
  • find_if
  • find_end
  • for_each
  • generate
  • generate_n
  • includes
  • max_element
  • merge
  • min_element
  • partition
  • remove
  • remove
  • remove_copy
  • remove_if
  • remove_copy_if
  • replace
  • replace_copy
  • replace_if
  • replace_copy_if
  • reverse
  • reverse_copy
  • rotate
  • rotate_copy
  • search
  • search_n
  • swap_ranges
  • transform
  • unique
  • unique_copy

adjacent_find

  • 找出第一組滿足條件的相鄰元素,版本一是指兩個元素相等;版本二允許用戶指定一個二元運算,兩個操作數分別是相鄰的第一元素和第二元素
#include <iostream> #include <vector>template <class ForwardIterator> ForwardIterator adjacent_find(ForwardIterator first,ForwardIterator last){if (first != last){ForwardIterator next = first; ++next;while(next != last){if(*first == *next){return first;}++first;++next;}}return last; }bool myfunction(int i,int j){return (i == j); }int main(){int myints[] = {5,20,5,30,30,20,10,10,20};std::vector<int>my_vector(myints,myints+8);std::vector<int>::iterator it;//using default comparisonit = std::adjacent_find(my_vector.begin(),my_vector.end());if (it != my_vector.end())std::cout << "The first pair of repeated elements are:" << *it << '\n';//using predicate comparison//it當前指定的位置是30, 自增錯過相鄰的一堆元素 30it = std::adjacent_find(++it,my_vector.end(), myfunction);if (it != my_vector.end())std::cout << "The first pair of repeated elements are:" << *it << '\n'; }///Users/chy/Desktop/exceptional/cmake-build-debug/exceptional //The first pair of repeated elements are:30 //The first pair of repeated elements are:10 // //Process finished with exit code 0

Count

  • 運用equality操作符號,將[first,last)內的所有元素和指定的數值value進行比較,并返回和value相等的個數
template <class InputIterator,class T> typename std::iterator_traits<InputIterator>::difference_type count(InputIterator first,InputIterator last,const T& value){typename std::iterator_traits<InputIterator>::difference_type ret = 0;while (first!=last){if (*first == value){++ret;}++first;}return ret; } // count algorithm example #include <iostream> // std::cout #include <algorithm> // std::count #include <vector> // std::vectorint main () {// counting elements in array:int myints[] = {10,20,30,30,20,10,10,20}; // 8 elementsint mycount = std::count (myints, myints+8, 10);std::cout << "10 appears " << mycount << " times.\n";// counting elements in container:std::vector<int> myvector (myints, myints+8);mycount = std::count (myvector.begin(), myvector.end(), 20);std::cout << "20 appears " << mycount << " times.\n";return 0; }

count_if

  • 使用仿函數pred實施于[first,last) 區間內的每一個元素身上,只要仿函數pred返回為true就進行計數
template <class InputIterator,class UnaryPredicate> typename std::iterator_traits<InputIterator>::difference_type count_if(InputIterator first,InputIterator last,UnaryPredicate pred){typename std::iterator_traits<InputIterator>::difference_type ret = 0;while (first!=last){if (pred(*first)){++ret;}++first;}return ret; } // count_if example #include <iostream> // std::cout #include <algorithm> // std::count_if #include <vector> // std::vectorbool IsOdd (int i) { return ((i%2)==1); }int main () {std::vector<int> myvector;for (int i=1; i<10; i++) myvector.push_back(i); // myvector: 1 2 3 4 5 6 7 8 9int mycount = count_if (myvector.begin(), myvector.end(), IsOdd);std::cout << "myvector contains " << mycount << " odd values.\n";return 0; }

find函數

  • 循環查找,找到第一個匹配的條件者,返回一個迭代器指向這個元素,否則返回迭代器last
template<class InputIterator, class T>InputIterator find (InputIterator first, InputIterator last, const T& val) {while (first!=last) {if (*first==val) return first;++first;}return last; } // find example #include <iostream> // std::cout #include <algorithm> // std::find #include <vector> // std::vectorint main () {// using std::find with array and pointer:int myints[] = { 10, 20, 30, 40 };int * p;p = std::find (myints, myints+4, 30);if (p != myints+4)std::cout << "Element found in myints: " << *p << '\n';elsestd::cout << "Element not found in myints\n";// using std::find with vector and iterator:std::vector<int> myvector (myints,myints+4);std::vector<int>::iterator it;it = find (myvector.begin(), myvector.end(), 30);if (it != myvector.end())std::cout << "Element found in myvector: " << *it << '\n';elsestd::cout << "Element not found in myvector\n";return 0; }

find_if

template<class InputIterator, class UnaryPredicate>InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) {while (first!=last) {if (pred(*first)) return first;++first;}return last; } // find_if example #include <iostream> // std::cout #include <algorithm> // std::find_if #include <vector> // std::vectorbool IsOdd (int i) {return ((i%2)==1); }int main () {std::vector<int> myvector;myvector.push_back(10);myvector.push_back(25);myvector.push_back(40);myvector.push_back(55);std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);std::cout << "The first odd value is " << *it << '\n';return 0; }

find_end

  • 在序列一[first1,last1)的區間查找序列二[first2,last2)的最后一次出現點,如果序列一不存在完全匹配序列二的子序列就返回迭代器last1

  • 如果具備逆向查找的能力,算法的思想就變成了首次出現的地點,逆向查找的關鍵在于迭代器的雙向移動的能力
  • 最后需要將逆向迭代器轉化為正向迭代器,而不是直接移動逆向迭代器,因為正向迭代器和逆向迭代器之間存在奇妙的實體關系和邏輯關系
template<class ForwardIterator1, class ForwardIterator2>ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2) {if (first2==last2) return last1; // specified in C++11ForwardIterator1 ret = last1;while (first1!=last1){ForwardIterator1 it1 = first1;ForwardIterator2 it2 = first2;while (*it1==*it2) { // or: while (pred(*it1,*it2)) for version (2)++it1; ++it2;if (it2==last2) { ret=first1; break; }if (it1==last1) return ret;}++first1;}return ret; } // find_end example #include <iostream> // std::cout #include <algorithm> // std::find_end #include <vector> // std::vectorbool myfunction (int i, int j) {return (i==j); }int main () {int myints[] = {1,2,3,4,5,1,2,3,4,5};std::vector<int> haystack (myints,myints+10);int needle1[] = {1,2,3};// using default comparison:std::vector<int>::iterator it;it = std::find_end (haystack.begin(), haystack.end(), needle1, needle1+3);if (it!=haystack.end())std::cout << "needle1 last found at position " << (it-haystack.begin()) << '\n';int needle2[] = {4,5,1};// using predicate comparison:it = std::find_end (haystack.begin(), haystack.end(), needle2, needle2+3, myfunction);if (it!=haystack.end())std::cout << "needle2 last found at position " << (it-haystack.begin()) << '\n';return 0; }

find_first_of

  • 返回第二個序列中元素在第一序列第一次匹配的的地點
  • 例子:找出字符串synesthesia中元音字母(第二序列 aeiou),即找出第二序列中任意元素出現于第一序列的地點,此例將返回第一個 e;
  • 如果第一序列不包含任何第二序列中的任何元素返回的將是last1
  • 算法第一個版本使用元素型別提供的equality操作符號,第二版本使用用戶指定的pred二元運算符號
template<class InputIterator,class ForwardIterator> ForwardIterator find_first_of(InputIterator first1,InputIterator last1,ForwardIterator first2,ForwardIterator last2){while (first1 != last1){for (ForwardIterator it = first2;it!=last2;++it) {if (*it == *first1){return first1;}}++first1;}return last1; } bool comp_case_insensitive(char c1,char c2){return (std::tolower(c1)==std::tolower(c2)); }int main(){int mychars[] = {'a','b','c','A','B','C'};std::vector<char>hasstack(mychars,mychars+6);std::vector<char>::iterator it;int needle[] = {'A','B','C'};//using default comparisonit = std::find_first_of(hasstack.begin(),hasstack.end(),needle,needle+3);if (it != hasstack.end()){std::cout << "The first match is: " << *it << '\n';}//using predicate comparisonit = std::find_first_of(hasstack.begin(),hasstack.end(),needle,needle+3, comp_case_insensitive);if (it != hasstack.end()){std::cout << "The first match is: " << *it << '\n';} }

for_each

  • 將仿函數定義于[first,last)區間內的每一個元素的身上
  • 但是仿函數f不可以改變元素的內容,因為使用的迭代器的類型都是InputIterators,不保證接受賦值的行為
  • 如果需要對元素的數值進行修改,需要使用算法 transform
  • 仿函數可以返回一個數值,但是這個數值一般會被忽略
template<class InputIterator, class Function>Function for_each(InputIterator first, InputIterator last, Function fn) {while (first!=last) {fn (*first);++first;}return fn; // or, since C++11: return move(fn); } void myfunction(int i){ //functionstd::cout << i << ' '; }struct myclass { //function object typevoid operator()(int i){std::cout << i << ' ';} }myobject;int main(){std::vector<int>myvector;myvector.emplace_back(10);myvector.emplace_back(20);myvector.emplace_back(30);std::cout << "myvector contains: ";std::for_each(myvector.begin(),myvector.end(), myfunction);std::cout << '\n';std::cout << "myvector contains: ";std::for_each(myvector.begin(),myvector.end(), myobject); }

generate

  • 將仿函數gen的運算結果填寫在[first ,last)區間內的所有元素身上
  • 填寫使用的是迭代器所指元素的 assignment 操作符
template <class ForwardIterator, class Generator>void generate ( ForwardIterator first, ForwardIterator last, Generator gen ) {while (first != last) {*first = gen();++first;} } //function generator int RandomNumber(){return (std::rand()%100); } //class generator struct c_unique{int current;c_unique(){current = 0;}int operator()(){return ++current;} }UniqueNumber;int main(){std::srand(unsigned (std::time(0)));std::vector<int>myvector(8);std::generate(myvector.begin(),myvector.end(),RandomNumber);std::cout << "myvector contains:";for(std::vector<int>::iterator it = myvector.begin();it!=myvector.end();++it){std::cout << *it << ' ';}std::cout << '\n';std::generate(myvector.begin(),myvector.end(),UniqueNumber);std::cout << "myvector contains:";for(std::vector<int>::iterator it = myvector.begin();it!=myvector.end();++it){std::cout << *it << ' ';}std::cout << '\n'; }

generate_n

  • 將仿函數gen的運算結果填寫在first開始的n個元素上
  • 填寫使用的是迭代器所指元素的 assignment 操作符
template <class OutputIterator, class Size, class Generator>void generate_n ( OutputIterator first, Size n, Generator gen ) {while (n>0) {*first = gen();++first; --n;} } // generate_n example #include <iostream> // std::cout #include <algorithm> // std::generate_nint current = 0; int UniqueNumber () { return ++current; }int main () {int myarray[9] = {0};std::generate_n (myarray, 5, UniqueNumber);std::cout << "myarray contains:";for (int i=0; i<9; ++i)std::cout << ' ' << myarray[i];std::cout << '\n';return 0; }

includes 應用于有序的區間

  • 判斷序列二是否涵蓋于序列一
  • 兩個序列都要求有序,其內部元素是可以重復的
  • 涵蓋的含義是其內的所有元素都被另外一個元素包含。
  • 判斷元素是否相等,必須使用less 或者 greater
  • 默認使用遞增排序 即operator <? 二者等價 ,less可以省略
std::includes(S1.begin(),S1.end(),S2.begin(),S2.end());std::includes(S1.begin(),S1.end(),S2.begin(),S2.end(),std::less<int>());
  • 如果是按照從大到小進行排序,就必須使用仿函數 greater
std::includes(S1.begin(),S1.end(),S2.begin(),S2.end(),std::greater<int>());
  • 兩個序列的元素都可以重復,S1包含一個S2的子集合,假設某個元素在S2出現n次,在S1出現m次,如果m<n 就會報錯

//最新版 template <class InputIterator1,class InputIterator2> bool includes(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2){while (first2 != last2){if (first1 == last1 || (*first2 < *first1)){return false;}if (!(*first1 < *first2)){++first2;}++first1;}return true; }//舊版 //判斷區間二 中的每個元素 數值是否都存在于區間一 //區間一和區間二都是sorted ranges template <class InputIterator1,class InputIterator2> bool includes(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2){while(first1!=last1 && first2!=last2){if (*first2 < *first1){return false;} else if(*first2 > *first1){++first1;} else{++first1;++first2;}}return first2 == last2; }//二元運算 comp //前提是序列一和序列二都是 sorted ranges template <class InputIterator1,class InputIterator2,class Compare> bool includes(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,Compare comp){while(first1!=last1 && first2!=last2){if (comp(*first2,*first1)){return false;} else if(comp(*first1,*first2)){++first1;} else{++first1;++first2;}}return first2 == last2; }
  • 版本二? 如果你傳入了一個二元運算符comp,卻不能使以下的case3代表兩個元素相等

  • 這個comp會導致整個includes算法語義錯誤。但是comp的型別是Compare既不是BinaryPredicate 也不是BinaryOperation,所以并非隨便一個二元運算符號都可以用于作為comp的參數?
// includes algorithm example #include <iostream> // std::cout #include <algorithm> // std::includes, std::sortbool myfunction (int i, int j) { return i<j; }int main () {int container[] = {5,10,15,20,25,30,35,40,45,50};int continent[] = {40,30,20,10};std::sort (container,container+10);std::sort (continent,continent+4);// using default comparison:if ( std::includes(container,container+10,continent,continent+4) )std::cout << "container includes continent!\n";// using myfunction as comp:if ( std::includes(container,container+10,continent,continent+4, myfunction) )std::cout << "container includes continent!\n";return 0; }

max_element

  • 返回最大的元素
template <class ForwardIterator> ForwardIterator max_element(ForwardIterator first,ForwardIterator last){if (first==last){return last;}ForwardIterator largest = first;while(++first!=last){if(*largest < *first){largest = first;}}return largest; }

Merge 應用于有序區間

  • 將兩個排序的集合S1和S2,合并起來置于另外一段空間,得到一個有序的序列
  • 返回一個迭代器指向最后的結果序列的最后一個元素的位置

template <class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator merge(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result){while(first1 != last1 && first2 != last2){ //兩個都尚未走完if (*first2 < *first1){*result = *first2;++first2;} else{*result = *first1;++first1;}++result;}return std::copy(first2,last2,std::copy(first1,last2,result)); } template <class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator merge(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result){while (true){if (first1 == last1){std::copy(first2,last2,result);}if (first2 == last2){std::copy(first1,last1,result);}*result++ = (*first1 < *first2) ? *first1++ : *first2++;} }

// includes algorithm example #include <iostream> // std::cout #include <algorithm> // std::includes, std::sortbool myfunction (int i, int j) { return i<j; }int main () {int container[] = {5,10,15,20,25,30,35,40,45,50};int continent[] = {40,30,20,10};std::sort (container,container+10);std::sort (continent,continent+4);std::vector<int>v(14,0);std::merge(container,container+10,continent,continent+4,v.begin());for(auto x : v){std::cout << x << ' ';}//5 10 10 15 20 20 25 30 30 35 40 40 45 50 return 0; }

min_element

template <class ForwardIterator>ForwardIterator min_element ( ForwardIterator first, ForwardIterator last ) {if (first==last) return last;ForwardIterator smallest = first;while (++first!=last)if (*first<*smallest) // or: if (comp(*first,*smallest)) for version (2)smallest=first;return smallest; } // min_element/max_element example #include <iostream> // std::cout #include <algorithm> // std::min_element, std::max_elementbool myfn(int i, int j) { return i<j; }struct myclass {bool operator() (int i,int j) { return i<j; } } myobj;int main () {int myints[] = {3,7,2,5,6,4,9};// using default comparison:std::cout << "The smallest element is " << *std::min_element(myints,myints+7) << '\n';std::cout << "The largest element is " << *std::max_element(myints,myints+7) << '\n';// using function myfn as comp:std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myfn) << '\n';std::cout << "The largest element is " << *std::max_element(myints,myints+7,myfn) << '\n';// using object myobj as comp:std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myobj) << '\n';std::cout << "The largest element is " << *std::max_element(myints,myints+7,myobj) << '\n';return 0; }

?partition

  • partition會重新排列區間內的元素,將所有被一元條件pred判定為true的元素排列在區間的前段,判定為false的元素排列在后端
  • 不穩定算法 不保持相對次序不變
  • 如果想保證相對次序不變 使用 stable_partition

template <class BidirectionalIterator,class UnaryPredicate> BidirectionalIterator partition(BidirectionalIterator first,BidirectionalIterator last, UnaryPredicate pred){while(first != last){while(pred(*first)){++first;if (first == last){return first;}}do{--last;if (first == last){return first;}} while (!pred(*last));std::swap(*first,*last);++first;} }

remove 移除但是不刪除

  • ?將每一個不與value相等的元素輪番賦值給first之后的空間
  • 返回的ForwardIterator標示出重新整理后的最后元素的下一個位置
  • 例子:序列{0,1,0,2,0,3,0,4} 移除0元素之后變成 {1,2,3,4,0,3,0,4}每一個與0不相等的元素被拷貝到一、二、三、四個位置,即第四個位置之后是這個算法的殘余數據
  • array不適用于remove 和 remove_if,因為array無法縮小尺寸,導致殘余的數據一直存在
  • 對于array,比較適用的算法是remove_copy()和remove_copy_if

template <class ForwardIterator,class T> ForwardIterator remove(ForwardIterator first,ForwardIterator last,const T& value){ForwardIterator result = first;while(first!=last){if (!(*first==value)){if(!(first==result)){*result = *first;}++result;}++first;}return result; } int main () {int myints[] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20//bounds of rangeint* begin = myints;int* end = myints + (sizeof (myints)/sizeof (int));end = std::remove(begin,end,20);std::cout << "range contains:";for(int* ptr = begin;ptr!=end;++ptr){std::cout << *ptr << ' ';}std::cout << '\n'; }

remove_copy

  • 將每一個不與value相等的元素輪番賦值給result開始的起始容器
  • 新的容器可以和先前的容器重疊,但是對于新的容器賦值超越了舊的容器的大小會產生無法預期的后果
  • 返回值OutputIterator會指向被復制的最后元素的下一個位置
template <class ForwardIterator,class OutputIterator,class T> ForwardIterator remove(ForwardIterator first,ForwardIterator last,OutputIterator result,const T& value){while(first!=last){if (!(*first==value)){*result = *first;++result;}++first;}return result; } int main () {int myints[] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20//bounds of rangeint* begin = myints;int* end = myints + (sizeof (myints)/sizeof (int));std::vector<int>myvector(5);std::remove_copy(begin,end,myvector.begin(),20);std::cout << "range contains:";for(auto ptr = myvector.begin();ptr!=myvector.end();++ptr){std::cout << *ptr << ' ';}std::cout << '\n'; }

remove_if

  • ?將每一個被pred核定為true的元素輪番賦值給first之后的空間,并不會真的刪除元素
  • 返回的ForwardIterator標示出重新整理后的最后元素的下一個位置
  • 可以通過將迭代器交給所在容器的erase member function
  • array不適用于remove 和 remove_if,因為array無法縮小尺寸,導致殘余的數據一直存在
  • 對于array,比較適用的算法是remove_copy()和remove_copy_if
template <class ForwardIterator,class UnaryPredicate> ForwardIterator remove_if(ForwardIterator first,ForwardIterator last,UnaryPredicate pred){ForwardIterator result = first;while(first!=last){if (!pred(*first)){if (result != first){*result = *first;}++result;}++first;}return result; } // remove_if example #include <iostream> // std::cout #include <algorithm> // std::remove_ifbool myfunction (int i, int j) { return i<j; }int main () {int myints[] = {1,2,3,4,5,6,7,8,9}; // 1 2 3 4 5 6 7 8 9// bounds of range:int* pbegin = myints; // ^int* pend = myints+sizeof(myints)/sizeof(int); // ^ ^pend = std::remove_if (pbegin, pend, IsOdd); // 2 4 6 8 ? ? ? ? ?// ^ ^std::cout << "the range contains:";for (int* p=pbegin; p!=pend; ++p)std::cout << ' ' << *p;std::cout << '\n';return 0; }

remove_copy_if

  • ?將每一個被pred核定為true的元素賦值給result開始的空間,并不會真的刪除元素
  • 可以通過將迭代器交給所在容器的erase member function
  • array不適用于remove 和 remove_if,因為array無法縮小尺寸,導致殘余的數據一直存在
  • 對于array,比較適用的算法是remove_copy()和remove_copy_if
template <class InputIterator, class OutputIterator, class UnaryPredicate>OutputIterator remove_copy_if (InputIterator first, InputIterator last,OutputIterator result, UnaryPredicate pred) {while (first!=last) {if (!pred(*first)) {*result = *first;++result;}++first;}return result; } // remove_copy_if example #include <iostream> // std::cout #include <algorithm> // std::remove_copy_if #include <vector> // std::vectorbool IsOdd (int i) { return ((i%2)==1); }int main () {int myints[] = {1,2,3,4,5,6,7,8,9};std::vector<int> myvector (9);std::remove_copy_if (myints,myints+9,myvector.begin(),IsOdd);std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

replace

  • 將指定區間內的所有舊的元素使用新的數值進行替換
template <class ForwardIterator, class T>void replace (ForwardIterator first, ForwardIterator last,const T& old_value, const T& new_value) {while (first!=last) {if (*first == old_value) *first=new_value;++first;} } // replace algorithm example #include <iostream> // std::cout #include <algorithm> // std::replace #include <vector> // std::vectorint main () {int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };std::vector<int> myvector (myints, myints+8); // 10 20 30 30 20 10 10 20std::replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

replace_copy

  • 將新的序列復制到result指定的容器
  • 返回的OutputIterator指向被復制的最后一個元素的下一個位置
  • 并不會改變先前的序列
template < class ForwardIterator, class UnaryPredicate, class T >void replace_if (ForwardIterator first, ForwardIterator last,UnaryPredicate pred, const T& new_value) {while (first!=last) {if (pred(*first)) *first=new_value;++first;} } // replace_if example #include <iostream> // std::cout #include <algorithm> // std::replace_if #include <vector> // std::vectorbool IsOdd (int i) { return ((i%2)==1); }int main () {std::vector<int> myvector;// set some values:for (int i=1; i<10; i++) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::replace_if (myvector.begin(), myvector.end(), IsOdd, 0); // 0 2 0 4 0 6 0 8 0std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

replace_if

  • 將pred判定為true的元素使用新值進行替換
template < class ForwardIterator, class UnaryPredicate, class T >void replace_if (ForwardIterator first, ForwardIterator last,UnaryPredicate pred, const T& new_value) {while (first!=last) {if (pred(*first)) *first=new_value;++first;} } // replace_if example #include <iostream> // std::cout #include <algorithm> // std::replace_if #include <vector> // std::vectorbool IsOdd (int i) { return ((i%2)==1); }int main () {std::vector<int> myvector;// set some values:for (int i=1; i<10; i++) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::replace_if (myvector.begin(), myvector.end(), IsOdd, 0); // 0 2 0 4 0 6 0 8 0std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

replace_copy_if

  • 其行為類似replace_if()?
  • 新的序列會被復制到result指定的區間內
  • 返回的OutputIterator指向被復制的最后一個元素的下一個位置
  • 并不會改變先前的序列
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) {while (first!=last) {*result = (pred(*first))? new_value: *first;++first; ++result;}return result; } // replace_copy_if example #include <iostream> // std::cout #include <algorithm> // std::replace_copy_if #include <vector> // std::vectorbool IsOdd (int i) { return ((i%2)==1); }int main () {std::vector<int> foo,bar;// set some values:for (int i=1; i<10; i++) foo.push_back(i); // 1 2 3 4 5 6 7 8 9bar.resize(foo.size()); // allocate spacestd::replace_copy_if (foo.begin(), foo.end(), bar.begin(), IsOdd, 0);// 0 2 0 4 0 6 0 8 0std::cout << "bar contains:";for (std::vector<int>::iterator it=bar.begin(); it!=bar.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

reverse

  • 將序列中的元素在原有的容器中顛倒重排
  • 根據迭代器的類型 (雙向迭代器或者隨機迭代器)進行偏特化設計
template <class BidirectionalIterator>void reverse (BidirectionalIterator first, BidirectionalIterator last) {while ((first!=last)&&(first!=--last)) {std::iter_swap (first,last);++first;} } // reverse algorithm example #include <iostream> // std::cout #include <algorithm> // std::reverse #include <vector> // std::vectorint main () {std::vector<int> myvector;// set some values:for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::reverse(myvector.begin(),myvector.end()); // 9 8 7 6 5 4 3 2 1// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

reverse_copy_if

  • 行為類似reverse
  • 新的序列會被復制到result指定的區間內
  • 返回的OutputIterator指向被復制的最后一個元素的下一個位置
  • 并不會改變先前的序列
template <class BidirectionalIterator, class OutputIterator>OutputIterator reverse_copy (BidirectionalIterator first,BidirectionalIterator last, OutputIterator result) {while (first!=last) {--last;*result = *last;++result;}return result; } // reverse_copy example #include <iostream> // std::cout #include <algorithm> // std::reverse_copy #include <vector> // std::vectorint main () {int myints[] ={1,2,3,4,5,6,7,8,9};std::vector<int> myvector;myvector.resize(9); // allocate spacestd::reverse_copy (myints, myints+9, myvector.begin());// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

rotate

  • 將[first,middle)和[middle,last)內的元素互換
  • middle指向的元素會成為容器的第一個元素
  • 其功能類似swap_ranges,但是swap_ranges只能交換兩個長度相同的區間
  • rotate可以交換兩個長度不同的區間

template <class ForwardIterator>void rotate (ForwardIterator first, ForwardIterator middle,ForwardIterator last) {ForwardIterator next = middle;while (first!=next){swap (*first++,*next++);if (next==last) next=middle;else if (first==middle) middle=next;} }
  • 先交換元素的數值,再進行迭代器的遞增

int main () {int myints[] = {1,2,3,4,5,6,7,8,9}; // 1 2 3 4 5 6 7 8 9std::vector<int>myvector(myints,myints+9);std::rotate(myvector.begin(),myvector.begin()+3,myvector.end());std::cout << "the range contains:";for (auto temp : myvector)std::cout << ' ' << temp;std::cout << '\n'; //the range contains: 4 5 6 7 8 9 1 2 3return 0; }

?rote_copy

  • 類似于rote 將產生的新的序列置于result所指出的容器中
  • 返回的OutputIterator指向被復制的最后一個元素的下一個位置
  • 并不會改變先前的序列
  • 操作過程:將后端復制到新的容器的開端,再將前段內容復制到新的容器
template <class ForwardIterator,class OutputIterator> OutputIterator rotate_copy(ForwardIterator first,ForwardIterator middle,ForwardIterator last,OutputIterator result){result = std::copy(middle,last,result);return std::copy(first,middle,result); } int main () {int myints[] = {1,2,3,4,5,6,7,8,9}; // 1 2 3 4 5 6 7 8 9std::vector<int>myvector(myints,myints+9);std::vector<int>my_tmp(9,0);std::rotate_copy(myvector.begin(),myvector.begin()+3,myvector.end(),my_tmp.begin());std::cout << "the range contains:";for (auto temp : my_tmp)std::cout << ' ' << temp;std::cout << '\n'; //the range contains: 4 5 6 7 8 9 1 2 3 // myvector the range contains: 1 2 3 4 5 6 7 8 9return 0; }

?Search

  • 在序列一種查找序列二中首次出現的點
  • 如果不存在完全匹配的子序列,返回序列一的last
template <class ForwardIterator1,class ForwardIterator2> ForwardIterator1 search(ForwardIterator1 first1,ForwardIterator1 last1,ForwardIterator2 first2,ForwardIterator2 last2){if(first2 == last2) return first1;while(first1 != last1){ForwardIterator1 it1 = first1;ForwardIterator2 it2 = first2;while (*it1 == *it2){++it1;++it2;if (*it2==last2)return first1;if (*it1==last1)return last1;}++first1;}return last1; } // search algorithm example #include <iostream> // std::cout #include <algorithm> // std::search #include <vector> // std::vectorbool mypredicate (int i, int j) {return (i==j); }int main () {std::vector<int> haystack;// set some values: haystack: 10 20 30 40 50 60 70 80 90for (int i=1; i<10; i++) haystack.push_back(i*10);// using default comparison:int needle1[] = {40,50,60,70};std::vector<int>::iterator it;it = std::search (haystack.begin(), haystack.end(), needle1, needle1+4);if (it!=haystack.end())std::cout << "needle1 found at position " << (it-haystack.begin()) << '\n';elsestd::cout << "needle1 not found\n";// using predicate comparison:int needle2[] = {20,30,50};it = std::search (haystack.begin(), haystack.end(), needle2, needle2+3, mypredicate);if (it!=haystack.end())std::cout << "needle2 found at position " << (it-haystack.begin()) << '\n';elsestd::cout << "needle2 not found\n";return 0; }

search_n

  • 查找連續幾個符合條件的元素組成的子序列,返回一個迭代器指向該子序列起始的地方,找不到返回迭代器last
  • 版本一使用 equality 版本二使用 用戶指定的某個二元函數,使用仿函數實現
  • 例子:面對序列 {10,8,8,4,5,2,3,4}查找連續兩個8形成的子序列起點
  • iter1 = search_n (iv.begin(),iv.end(),2,8);
  • 例子:面對序列 {10,8,8,4,5,2,3,4}查找連續三個小于8的子序列起點
  • iter1 = search_n (iv.begin(),iv.end(),3,8,std::less<int>());

template <class ForwardIterator,class Size,class T> ForwardIterator search_n(ForwardIterator first,ForwardIterator last,Size count,const T& val){ForwardIterator it,limit;Size i;limit = first;std::advance(limit,std::distance(first,last)-count);while(first!=limit){it = first;i = 0;while(*it == val){++it;if (++i == count){return first;}}++first;}return last; } // search_n example #include <iostream> // std::cout #include <algorithm> // std::search_n #include <vector> // std::vectorbool mypredicate (int i, int j) {return (i==j); }int main () {int myints[]={10,20,30,30,20,10,10,20};std::vector<int> myvector (myints,myints+8);std::vector<int>::iterator it;// using default comparison:it = std::search_n (myvector.begin(), myvector.end(), 2, 30);if (it!=myvector.end())std::cout << "two 30s found at position " << (it-myvector.begin()) << '\n';elsestd::cout << "match not found\n";// using predicate comparison:it = std::search_n (myvector.begin(), myvector.end(), 2, 10, mypredicate);if (it!=myvector.end())std::cout << "two 10s found at position " << int(it-myvector.begin()) << '\n';elsestd::cout << "match not found\n";return 0; }

swap_ranges

  • 將[first1 ,last1) 區間內的元素和從[first2 開始個數相同的元素互相交換
  • 兩個區間不限定是否從屬于同一個區間 ,可以相同 可以不同
  • 如果第二個序列的長度小于第一個序列的長度,或者兩個序列在同一個序列中出現重疊,執行結果是不可預期的
  • 此算法返回一個迭代器 指向第二序列中最后一個被交換元素的下一個位置
template <class ForwardIterator1,class ForwardIterator2> ForwardIterator2 swap_ranges(ForwardIterator1 first1,ForwardIterator1 last1,ForwardIterator2 first2){while(first1 != last1){std::swap(*first1,*first2);++first1;++first2;}return first2; } // swap_ranges example #include <iostream> // std::cout #include <algorithm> // std::swap_ranges #include <vector> // std::vectorint main () {std::vector<int> foo (5,10); // foo: 10 10 10 10 10std::vector<int> bar (5,33); // bar: 33 33 33 33 33std::swap_ranges(foo.begin()+1, foo.end()-1, bar.begin());// print out results of swap:std::cout << "foo contains:";for (std::vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';std::cout << "bar contains:";for (std::vector<int>::iterator it=bar.begin(); it!=bar.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

transform

  • 第一版本使用仿函數op作用于區間中每一個元素的身上,產生一個新的序列
  • 第二版本使用仿函數binary_op作用于一雙元素的身上,第一個元素來自[first,last1),第二個元素來自從first2開始的序列,如果第二序列元素少,會出錯
  • 兩個版本的transform都會把結果放進迭代器result所標示的容器中
  • result可以指向源端容器,造成數據的覆蓋
  • 返回迭代器指向的是結果序列的最后元素的下一個位置
template <class InputIterator, class OutputIterator, class UnaryOperator>OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperator op) {while (first1 != last1) {*result = op(*first1); // or: *result=binary_op(*first1,*first2++);++result; ++first1;}return result; } // transform algorithm example #include <iostream> // std::cout #include <algorithm> // std::transform #include <vector> // std::vector #include <functional> // std::plusint op_increase (int i) { return ++i; }int main () {std::vector<int> foo;std::vector<int> bar;// set some values:for (int i=1; i<6; i++)foo.push_back (i*10); // foo: 10 20 30 40 50bar.resize(foo.size()); // allocate spacestd::transform (foo.begin(), foo.end(), bar.begin(), op_increase);// bar: 11 21 31 41 51// std::plus adds together its two arguments:std::transform (foo.begin(), foo.end(), bar.begin(), foo.begin(), std::plus<int>());// foo: 21 41 61 81 101std::cout << "foo contains:";for (std::vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

unique

  • 移除相鄰重復的元素
  • 移除所有重復的元素需要實現排序
  • 返回的迭代器指向新的區間的尾端,新區間內容不重復
  • 算法是穩定的,其所有保留下來的元素,其原始相對次序不改變

template <class ForwardIterator>ForwardIterator unique (ForwardIterator first, ForwardIterator last) {if (first==last) return last;ForwardIterator result = first;while (++first != last){if (!(*result == *first)) // or: if (!pred(*result,*first)) for version (2)*(++result)=*first;}return ++result; } // unique algorithm example #include <iostream> // std::cout #include <algorithm> // std::unique, std::distance #include <vector> // std::vectorbool myfunction (int i, int j) {return (i==j); }int main () {int myints[] = {10,20,20,20,30,30,20,20,10}; // 10 20 20 20 30 30 20 20 10std::vector<int> myvector (myints,myints+9);// using default comparison:std::vector<int>::iterator it;it = std::unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 ? ? ? ?// ^myvector.resize( std::distance(myvector.begin(),it) ); // 10 20 30 20 10// using predicate comparison:std::unique (myvector.begin(), myvector.end(), myfunction); // (no changes)// print out content:std::cout << "myvector contains:";for (it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

unique_copy

template <class InputIterator, class OutputIterator>OutputIterator unique_copy (InputIterator first, InputIterator last,OutputIterator result) {if (first==last) return result;*result = *first;while (++first != last) {typename iterator_traits<InputIterator>::value_type val = *first;if (!(*result == val)) // or: if (!pred(*result,val)) for version (2)*(++result)=val;}return ++result; } // unique_copy example #include <iostream> // std::cout #include <algorithm> // std::unique_copy, std::sort, std::distance #include <vector> // std::vectorbool myfunction (int i, int j) {return (i==j); }int main () {int myints[] = {10,20,20,20,30,30,20,20,10};std::vector<int> myvector (9); // 0 0 0 0 0 0 0 0 0// using default comparison:std::vector<int>::iterator it;it=std::unique_copy (myints,myints+9,myvector.begin()); // 10 20 30 20 10 0 0 0 0// ^std::sort (myvector.begin(),it); // 10 10 20 20 30 0 0 0 0// ^// using predicate comparison:it=std::unique_copy (myvector.begin(), it, myvector.begin(), myfunction);// 10 20 30 20 30 0 0 0 0// ^myvector.resize( std::distance(myvector.begin(),it) ); // 10 20 30// print out content:std::cout << "myvector contains:";for (it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }

總結

以上是生活随笔為你收集整理的STL源码剖析 数值算法 heap算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久99精品久久久久久久久久久久 | 在线精品视频免费播放 | 在线中文字母电影观看 | 国产在线探花 | 综合久久精品 | 成片免费观看视频大全 | 中文资源在线播放 | 深夜免费福利 | 黄色特一级 | 中文字幕亚洲情99在线 | 天天超碰 | 久久久久久久18 | 国产一区二区三精品久久久无广告 | 日本久久片 | 777视频在线观看 | 五月天婷婷狠狠 | 日韩在线视频播放 | 亚洲成人影音 | 精品国产不卡 | 在线观看一区 | 国产精品一区二区av日韩在线 | 一区二区久久 | 国产在线日韩 | 97成人精品区在线播放 | 国产精品久久久久久妇 | 国产v视频 | 黄网站app在线观看免费视频 | 国产精品入口传媒 | 深爱开心激情 | 成人啪啪18免费游戏链接 | 日本最新中文字幕 | 在线观看日韩专区 | www.五月天婷婷 | 欧美日韩视频在线观看免费 | 视频一区二区三区视频 | 国产精品激情在线观看 | 成人免费观看网站 | 99久久激情| 夜夜爽夜夜操 | 一本一道波多野毛片中文在线 | 国产黄色网 | 九九九九热精品免费视频点播观看 | 九九热只有这里有精品 | 成人免费视频网站 | av解说在线 | 久久久久久美女 | 视频二区在线视频 | 免费看成年人 | 99热手机在线 | 久久久久女人精品毛片 | 国产爽视频 | 99久久毛片| 久草在线综合 | 91片黄在线观看动漫 | 精品一区精品二区 | 国产精品岛国久久久久久久久红粉 | 在线观看理论 | 日韩av一区二区在线播放 | 国产不卡在线播放 | 久久久精品网站 | 精品视频免费久久久看 | h网站免费在线观看 | 黄视频网站大全 | 久草资源在线观看 | 在线不卡的av | 91精品久久久久 | 成年人视频在线免费播放 | 国内精品久久久久久久影视麻豆 | 国产精品久久久久久久久久久久久久 | 久久婷婷五月综合色丁香 | 国产一级久久 | 97在线观视频免费观看 | 国产精品亚州 | 右手影院亚洲欧美 | 久久久精品欧美一区二区免费 | www免费| 色婷婷视频在线 | 一级全黄毛片 | 国产免费又粗又猛又爽 | 日韩免费小视频 | 日韩理论在线播放 | 久久久久免费精品 | 最新av电影网站 | 国产精品成人一区二区 | 99r在线视频 | 婷婷九九| 欧美日韩视频网站 | 久久国产手机看片 | 久碰视频在线观看 | 婷婷六月激情 | 午夜视频一区二区 | 麻豆91精品视频 | 久久精品亚洲一区二区三区观看模式 | 日韩高清激情 | 亚洲一级黄色 | 亚洲精品视频在线观看免费视频 | 成人免费91 | 天堂黄色片 | 三上悠亚一区二区在线观看 | 国产小视频在线免费观看 | 精品99免费视频 | 亚洲精品中文字幕视频 | 欧美精品久久久久久久久久白贞 | 99r国产精品 | 97国产精品 | 精品国产乱码久久久久久1区二区 | 亚洲少妇xxxx | 五月婷婷黄色网 | 日本少妇高清做爰视频 | 操碰av| 人人人爽| 在线亚洲欧美日韩 | 91精品国产欧美一区二区成人 | 亚洲天堂精品视频 | 日韩久久激情 | 久久久国产精品麻豆 | 人人讲 | 国产免费又爽又刺激在线观看 | 精品美女久久久久久免费 | 日韩精品中文字幕一区二区 | 国产1区2区3区精品美女 | 国产精品久久久久久久久久 | 国产超碰在线观看 | 久久精品久久久久 | 我要看黄色一级片 | 在线观看你懂的网站 | 最近更新中文字幕 | 美女很黄免费网站 | 视频在线观看99 | 午夜视频日本 | 国产视频在线观看一区 | 日韩69视频 | 91av片| 国产在线观看二区 | 欧美 日韩 性 | 97色综合| 亚洲精品视频在线观看免费视频 | 亚洲最大的av网站 | www.人人草| 欧美一级淫片videoshd | 午夜精品999 | 国产午夜精品一区二区三区欧美 | 色www精品视频在线观看 | 99精彩视频在线观看免费 | 日韩精品一区二区免费 | 午夜精品视频一区二区三区在线看 | 国产高清不卡av | 国内外成人免费在线视频 | 免费a级毛片在线看 | 国产91aaa | 午夜色婷婷 | 国产成人福利片 | 久草在线免 | 在线亚洲欧美视频 | 97视频免费在线看 | 99在线精品视频在线观看 | 7777精品伊人久久久大香线蕉 | 亚洲精品欧美专区 | 国产精品一级在线 | 久久99在线观看 | 99九九免费视频 | 欧美大码xxxx| 国产做a爱一级久久 | 中文在线免费看视频 | 久久在线免费观看 | 亚洲国产成人久久 | 国产福利一区在线观看 | 在线 日韩 av | 免费a级大片 | 日日碰夜夜爽 | 国产精品毛片一区视频 | 亚洲欧美国产精品久久久久 | 色久综合 | 久艹在线免费观看 | 中文字幕欧美激情 | 中文有码在线 | 91精品国产欧美一区二区成人 | 美女久久网站 | 精品福利网站 | 插婷婷| 不卡的av | 在线 成人 | 97人人看 | 亚洲视频一级 | 国产中文欧美日韩在线 | 日韩av高清 | 在线观看国产日韩欧美 | 国产精品涩涩屋www在线观看 | 亚洲国产精品一区二区久久hs | av在线电影网站 | 国产99久久 | 99热只有精品在线观看 | 97色婷婷成人综合在线观看 | 日韩天天干 | 天天插天天爽 | 欧美日韩精品在线观看视频 | 亚洲国产mv | 99精品免费在线观看 | 精品国产美女在线 | 日韩久久精品一区 | www黄色| 手机av永久免费 | 久久国产高清 | 欧美成人a在线 | 中文字幕亚洲不卡 | 91视频免费国产 | www.com黄 | 久草在线资源观看 | 99热国产在线中文 | 超碰人人草 | 成人影片在线播放 | 婷婷激情影院 | 婷婷成人综合 | 天堂av在线网 | 久久av影视| 亚洲色图美腿丝袜 | 国产91在线观看 | 欧美一级片在线观看视频 | 在线小视频你懂得 | 婷婷六月久久 | 国产一区欧美一区 | 麻豆精品视频在线 | 欧美超碰在线 | 99在线精品视频 | 午夜影院先 | 91av色 | 狠狠干综合网 | 色欲综合视频天天天 | 中文字幕在线看视频 | 日韩欧美xxxx | 久久久黄视频 | 欧美成人精品欧美一级乱黄 | 中文字幕av专区 | 色综合亚洲精品激情狠狠 | 中文字幕韩在线第一页 | 夜色在线资源 | 色av男人的天堂免费在线 | 国产精品高清免费在线观看 | 日韩av区 | 奇米777777 | 国产精品热 | 国产精品电影一区二区 | 99免费看片 | 成人免费视频免费观看 | 久久视频在线观看免费 | 99精品视频精品精品视频 | 国产无限资源在线观看 | 国产精品美女久久久久久 | 一区二区三区www | 蜜桃视频精品 | 一区三区视频在线观看 | 久久国产精品一二三区 | 亚洲欧美精品一区二区 | a级免费观看 | 亚洲黄色一级视频 | 免费看十八岁美女 | 久久久精品成人 | 国产视频999 | 国产v亚洲v | 三级黄色理论片 | 91在线视频在线观看 | mm1313亚洲精品国产 | 在线观看网站av | 国产精品xxxx18a99 | 五月婷婷综合激情 | 久久综合欧美精品亚洲一区 | 韩日视频在线 | 国产精品黑丝在线观看 | 四虎国产精品免费 | 亚洲免费av一区二区 | 久久免费av电影 | 日本在线视频一区二区三区 | 亚洲精品在线一区二区 | 国产对白av| 久久96国产精品久久99软件 | 日韩精选在线 | 国产精品网站一区二区三区 | 国产一级视频免费看 | 国产一区在线不卡 | 欧美在线18 | 91禁看片 | 日韩精品久久久免费观看夜色 | 国产999免费视频 | 91精品国自产在线观看欧美 | 99国产精品视频免费观看一公开 | 久久在线精品 | 五月婷婷视频在线观看 | 天天干天天操天天搞 | 在线免费观看国产 | 亚洲激情在线观看 | 免费日韩 精品中文字幕视频在线 | 91麻豆精品久久久久久 | 99精品热视频 | 久久久久久久久久久免费av | 国产特级毛片aaaaaaa高清 | 国产成人久久77777精品 | 中字幕视频在线永久在线观看免费 | 亚洲黄色在线看 | 狠狠色丁香久久婷婷综合_中 | 欧美日本高清视频 | 丁香婷婷激情网 | 91亚洲欧美激情 | 波多野结衣一区二区 | 深夜免费小视频 | 欧美一级片免费 | 国内精品视频久久 | 四虎成人网 | 精品在线播放 | 国产成人精品午夜在线播放 | 亚洲一区二区91 | 在线免费av观看 | 日韩av一区二区三区在线观看 | 操操操夜夜操 | 国产h在线观看 | 女人18精品一区二区三区 | 欧美视频在线二区 | 日本 在线 视频 中文 有码 | 久久国产精品免费一区二区三区 | 91丨九色丨国产女 | 国产色就色 | 国产精品美女在线观看 | 久久久久北条麻妃免费看 | 中文字幕电影在线 | 国产精品不卡在线播放 | 狠狠的干 | 国产麻豆视频 | www.国产在线观看 | 国产高清一 | 欧美激精品| 成人黄色在线观看视频 | 成年人免费在线观看网站 | 97超碰色 | 免费亚洲精品 | 日韩av午夜 | 日韩精品在线免费播放 | 69精品| 久久免费看av | a视频在线观看 | 日韩在线观看三区 | 91香蕉嫩草 | 欧美性生活一级片 | 午夜精品一区二区三区免费视频 | 欧美精品视| 亚洲精品tv| 黄色在线看网站 | 2019精品手机国产品在线 | 久久99视频免费 | 在线午夜电影神马影院 | av福利在线| 麻花天美星空视频 | 欧美在线视频不卡 | 久久婷婷一区二区三区 | 欧美精品久久久久久久免费 | 成年人在线免费看 | 日韩午夜电影院 | 久久精品日本啪啪涩涩 | 国产视频精品免费播放 | 偷拍精偷拍精品欧洲亚洲网站 | av福利第一导航 | 午夜精品电影 | 中国成人一区 | 91网址在线观看 | 久久夜视频| 精品国产乱码久久 | 久久午夜国产精品 | av女优中文字幕在线观看 | 成年人视频在线观看免费 | 99这里有精品 | 国产中文字幕在线观看 | 99视频精品全部免费 在线 | 日韩欧美大片免费观看 | 亚洲国产成人在线播放 | a在线观看免费视频 | 日韩免费网站 | 久99热 | 国产91电影在线观看 | 丁香六月婷 | 久久久久久久免费观看 | 亚洲精品视频偷拍 | 久久久久久综合 | a视频在线看| 91网页版免费观看 | 久久夜靖品 | 成人性生交视频 | 日本精品在线视频 | 丁香九月激情综合 | 激情综合电影网 | 日韩精品大片 | 亚洲天堂社区 | 27xxoo无遮挡动态视频 | 国产一区二区免费看 | 91中文字幕网 | 欧美黄色软件 | 五月婷婷影院 | 国产精品视频地址 | 亚洲成av人电影 | 免费观看av网站 | 国产黄色片久久 | 日韩高清一二三区 | 久久爱综合 | 在线精品视频在线观看高清 | 一区二三国产 | 97看片 | 久久69av | 2019中文字幕网站 | 最近中文字幕视频完整版 | 国产精品久久嫩一区二区免费 | 天天色天天综合网 | 亚洲精品动漫久久久久 | 久久久久久久久久免费视频 | 91成人精品一区在线播放69 | 日韩激情第一页 | 久久大香线蕉app | 成人一区不卡 | 国产一区视频导航 | 69精品视频在线观看 | 9999激情| www夜夜 | 久久久精品一区二区三区 | 91成品人影院 | 啪啪肉肉污av国网站 | 久草男人天堂 | 久久99国产精品久久99 | 日韩动漫免费观看高清完整版在线观看 | 婷婷色av | 亚洲精品男人的天堂 | 中文字幕永久在线 | 婷婷干五月 | 国产精品久久久久久久久久久久午夜片 | 日韩激情视频在线观看 | 色欧美日韩 | 五月婷在线 | 国产亚洲欧美精品久久久久久 | 免费一级特黄毛大片 | 美女久久99| 成人91在线| 国产在线国产 | 在线观看a视频 | 亚洲视频 中文字幕 | 久久激情视频 久久 | 国产麻豆精品一区二区 | 久久久久久在线观看 | 日韩久久久久久久 | 成人免费视频在线观看 | 成人小视频免费在线观看 | 中文字幕传媒 | 伊人中文在线 | 中文字幕国产一区 | 2019中文字幕第一页 | 欧美先锋影音 | av资源免费在线观看 | 亚洲国产中文字幕在线观看 | 久久国产露脸精品国产 | 欧美在线视频一区二区三区 | 久久亚洲精品电影 | 色多多视频在线观看 | 久久福利综合 | 精品久久久久久亚洲综合网站 | 免费高清影视 | 国产午夜精品福利视频 | 天天插天天狠 | 久久国产精彩视频 | 日韩精品一区二区久久 | 久久99精品久久久久久三级 | 国产成人av一区二区三区在线观看 | 奇米四色影狠狠爱7777 | 成人资源在线观看 | 亚洲美女免费精品视频在线观看 | 天天色天天色 | 久久99久久99精品免观看软件 | 四虎成人免费观看 | 欧美激情操 | 麻豆国产视频 | 伊人狠狠色 | 国产精品理论在线观看 | 久久免费看a级毛毛片 | 午夜久久久久久久久久影院 | 日韩美视频 | 国产高清无线码2021 | 久久成人免费视频 | 中文字幕免费中文 | 色婷婷福利 | 欧美精品资源 | 四虎影视成人精品国库在线观看 | 日韩一级电影在线 | 色姑娘综合网 | 99久久精品一区二区成人 | 欧美日韩精品免费观看视频 | 日韩在线网址 | 久久视频精品 | 国产精品99免费看 | 久久综合久久综合这里只有精品 | 国产91精品久久久久 | 久久亚洲欧美 | 9免费视频 | 在线视频免费观看 | 欧美日韩中文在线视频 | 久久一区二区三区日韩 | 中文字幕成人网 | 日韩精品免费专区 | 久久久久久久久久久成人 | 久一网站| 亚洲人成影院在线 | 99精品视频网站 | 日日综合| 在线观看免费色 | 天天操天天操天天干 | 日本在线观看一区二区 | 不卡国产在线 | 丝袜美腿亚洲 | 天堂久久电影网 | 国产精品爽爽久久久久久蜜臀 | 国产在线免费观看 | 国产专区在线视频 | 激情综合五月天 | 99国产精品免费网站 | 亚洲精品成人 | 日本成人中文字幕在线观看 | 日韩国产欧美在线视频 | 福利一区二区 | 国产超碰在线观看 | 日本激情视频中文字幕 | a'aaa级片在线观看 | 日韩特级片 | 精品国产乱码久久久久久1区二区 | 欧美大片在线观看一区 | 国产精品久久嫩一区二区免费 | 欧美一区二区免费在线观看 | 亚洲性xxxx| 久久97久久97精品免视看 | 中文字幕黄色 | 黄色成品视频 | 99免费视频 | 久福利| 黄色亚洲大片免费在线观看 | 香蕉久久久久 | 美女黄频免费 | 国产精品日韩 | 国产精品久久久久久爽爽爽 | 成人aaa毛片| 在线视频观看成人 | 97香蕉久久超级碰碰高清版 | av电影中文字幕在线观看 | 国产视频一区二区在线 | 永久免费在线 | 日韩在线视 | 久久精品美女视频网站 | 国产色拍| 久久精品7 | 国产精品不卡一区 | 热久久免费视频精品 | 91中文在线视频 | 色丁香色婷婷 | 久久精品欧美日韩精品 | 久久久亚洲网站 | 久久视频在线视频 | 99c视频在线 | 91丨九色丨国产女 | 免费观看91视频大全 | 亚洲va男人天堂 | 中文字幕免费 | 亚洲国产资源 | 国内精品久久久久 | 婷婷激情久久 | 久久综合中文色婷婷 | 欧美 高跟鞋交 xxxxhd | 精品一区二区亚洲 | 日韩影视在线 | 国产xxxxx在线观看 | 中文字幕在线看人 | 中文字幕色婷婷在线视频 | 日韩欧美精品一区二区 | 在线观看91精品视频 | 日本动漫做毛片一区二区 | www.夜色.com | 99人久久精品视频最新地址 | 伊人射 | 久久成年人网站 | 偷拍福利视频一区二区三区 | 九九久久精品视频 | 黄色aaaaa| 亚洲 欧美 国产 va在线影院 | 三级av在线免费观看 | 欧洲av不卡 | 国产乱老熟视频网88av | 日韩免费一区二区在线观看 | 亚洲jizzjizz日本少妇 | 国产精品人人做人人爽人人添 | 五月天久久综合 | 最新中文在线视频 | 99精品在线免费观看 | 激情一区二区三区欧美 | 免费在线观看黄网站 | 91精品对白一区国产伦 | 色综合久久88色综合天天 | 蜜桃av久久久亚洲精品 | 免费a现在观看 | 欧美日韩成人 | 日韩视频区 | 又爽又黄又刺激的视频 | 欧美电影在线观看 | av无限看| 欧美精品一区二区在线播放 | 综合国产在线 | 精品一区二区电影 | 日韩三级.com | 深夜福利视频一区二区 | 亚洲国产成人av网 | 中文字幕乱码日本亚洲一区二区 | 成人免费视频网址 | 亚洲黄色av网址 | 波多野结衣视频网址 | 亚州精品天堂中文字幕 | 五月婷丁香网 | 日日碰狠狠添天天爽超碰97久久 | 亚洲一区精品人人爽人人躁 | www.888.av| 国产做aⅴ在线视频播放 | 麻花豆传媒mv在线观看网站 | 99热这里只有精品1 av中文字幕日韩 | 91视频国产高清 | 九九视频一区 | 国产色婷婷精品综合在线手机播放 | 亚洲精品视频免费观看 | 国产91九色蝌蚪 | 可以免费看av | 亚洲精品小视频在线观看 | 国产91精品看黄网站在线观看动漫 | 色婷婷伊人 | 日韩在线观看你懂的 | 超碰精品在线观看 | 99久久精品免费看国产麻豆 | 91av视频在线免费观看 | 9在线观看免费高清完整版在线观看明 | 亚洲更新最快 | 97超碰.com| 狠狠躁日日躁 | 精品国产一区二区三区四区vr | 成人午夜精品福利免费 | 日韩中文字幕亚洲一区二区va在线 | 日韩精品专区在线影院重磅 | 欧美在线18 | 欧美日韩精品在线视频 | 操高跟美女 | 成人黄色小视频 | 精品国产乱码久久久久久三级人 | 国产精品一区二区三区视频免费 | 国产精品涩涩屋www在线观看 | 国内精品久久久久影院优 | www.国产毛片 | 亚洲国产欧美在线看片xxoo | 日韩精品中文字幕一区二区 | 久草在线免 | 国产伦精品一区二区三区四区视频 | 色婷婷狠狠干 | v片在线看 | 人人爽人人搞 | 国产成人精品a | 波多野结衣精品在线 | 五月婷婷香蕉 | 992tv在线观看 | av一本久道久久波多野结衣 | 日韩中字在线 | 午夜精品久久久久久久99无限制 | 视频在线观看一区 | 国产精品高清一区二区三区 | 日韩免费视频一区二区 | 亚洲一二三区精品 | 成人a大片 | 免费高清在线观看成人 | 日韩综合一区二区 | 久草香蕉在线 | 亚洲aⅴ在线观看 | 欧美一区二区日韩一区二区 | 99久久精品国产毛片 | 国产女人18毛片水真多18精品 | 成人在线观看影院 | 久久国产精品免费观看 | av在线永久免费观看 | 99r在线视频 | 国产69精品久久久久久久久久 | 特级黄色电影 | 午夜国产福利在线 | 久久成人一区 | 二区视频在线观看 | 岛国av在线不卡 | 中国精品少妇 | 夜夜澡人模人人添人人看 | 欧美日韩精品在线 | 免费毛片一区二区三区久久久 | 中文字幕五区 | 亚洲涩涩网站 | 久久久久伦理电影 | 九九视频在线观看视频6 | 色在线免费 | 91久久奴性调教 | 国产色视频网站 | 亚洲色图av | 色综合天天色综合 | 干 操 插| 亚洲国产精品久久久 | 91豆麻精品91久久久久久 | 97精品久久 | 福利在线看片 | 免费看91的网站 | 99免费视频| 91精品人成在线观看 | 久久99国产精品久久99 | 亚洲视频久久久久 | 国产黄在线观看 | 免费99精品国产自在在线 | 天天操月月操 | 日韩大片在线观看 | a在线v| 久久9999久久 | 久草视频在线看 | 永久免费的啪啪网站免费观看浪潮 | 天堂网一区二区 | 久久免费视频6 | 91精品国产综合久久福利 | 欧美久久九九 | 日日夜夜综合网 | 国产精品久久电影网 | 欧美黄色免费 | 免费av的网站 | 亚洲一区二区三区四区在线视频 | 久草亚洲视频 | 韩日av在线 | 黄色毛片视频免费 | 天天天天色射综合 | 亚洲狠狠| av免费在线播放 | 日韩精品一区二区三区不卡 | 日韩精品视频一二三 | 久久艹国产视频 | 久久99国产精品 | 久久tv | 亚洲精品久久久久中文字幕m男 | 日韩精品一二三 | 500部大龄熟乱视频 欧美日本三级 | 97激情影院| 日韩一区二区三区免费视频 | 国产成人免费在线观看 | 亚洲国产无 | 日日摸日日爽 | 色就色,综合激情 | av免费看在线| 人人草在线视频 | 网站免费黄 | 一区三区视频 | 一二三区在线 | 激情五月婷婷综合 | 操操操夜夜操 | 精品伊人久久久 | 久草国产视频 | 欧美日韩一级视频 | 国产精品九九热 | 丝袜+亚洲+另类+欧美+变态 | 欧美国产日韩在线视频 | 国产乱码精品一区二区三区介绍 | 久久久免费国产 | 欧美性网站 | 日韩欧美一区二区三区黑寡妇 | 欧美性另类| 国产精品尤物视频 | 久久精品中文视频 | 色视频在线 | ,久久福利影视 | 天天摸天天操天天舔 | 黄色免费看片网站 | 一区二区高清在线 | 午夜免费福利视频 | 日韩精品久久中文字幕 | 亚洲最新视频在线 | 亚洲精品999 | 九九免费精品视频在线观看 | 国产成人高清 | 国产高清不卡 | 天天草天天干天天射 | 中文字幕色婷婷在线视频 | 国产剧情在线一区 | 亚洲国产精久久久久久久 | 久在线观看视频 | 嫩小bbbb摸bbb摸bbb| 最新国产在线观看 | 91丝袜美腿| 国内小视频在线观看 | 亚洲精品国产精品国自产在线 | 97日日碰人人模人人澡分享吧 | 国产色在线,com | 日韩高清无线码2023 | 成人午夜免费福利 | 欧美aⅴ在线观看 | 福利片视频区 | 日韩成人在线一区二区 | 91传媒在线播放 | 亚洲国产精品女人久久久 | 亚洲天堂社区 | 亚洲精品日韩一区二区电影 | 国产精品久久久久免费观看 | 久草热视频 | 狠狠操欧美 | 69xxxx欧美| 国产免费嫩草影院 | 国产免费视频在线 | 免费色视频网址 | 香蕉在线视频观看 | 在线视频专区 | 97手机电影网 | 日韩在线观看中文 | 久久国产高清视频 | 久久免费国产精品1 | 午夜 久久 tv| 日韩激情视频在线观看 | 欧美一区成人 | av片中文字幕 | 日韩草比 | 精品久久久久一区二区国产 | 欧洲精品视频一区二区 | 亚洲精品玖玖玖av在线看 | 一区二区精品久久 | 韩日视频在线 | 国产精品高潮呻吟久久av无 | 欧美一级在线 | 蜜臀av性久久久久av蜜臀三区 | 天天做天天爱天天爽综合网 | 精品美女久久久久 | 五月天国产精品 | av中文电影 | 国产人成一区二区三区影院 | 亚洲第一伊人 | 天天天天天天干 | 伊人色综合久久天天网 | 在线观看亚洲精品视频 | 国产成人高清av | 美女网站在线观看 | 在线免费成人 | 欧美精品亚洲二区 | 国产色视频一区二区三区qq号 | 久久精品一区二区三 | 91视频免费观看 | 狠狠插狠狠干 | 亚洲永久精品在线 | 亚洲91视频 | 一级片免费观看 | 在线观看亚洲精品 | 成人小视频免费在线观看 | 99精品国产成人一区二区 | 麻豆视频免费入口 | 中文字幕中文字幕中文字幕 | 国产黄色资源 | 色诱亚洲精品久久久久久 | 中文字幕乱视频 | 久久在视频| 成人久久精品视频 | 99久久久久久久久 | 五月婷香蕉久色在线看 | 免费看黄色91 | 手机在线日韩视频 | a极黄色片| 在线视频久 | 久草手机视频 | 99999精品| 欧美一级特黄aaaaaa大片在线观看 | 一级片免费观看视频 | 亚洲国产精品va在线看黑人动漫 | 久久久国产高清 | 久久精品中文字幕 | 色999视频| 成人av一区二区三区 | 香蕉网在线播放 | 日韩黄色大片在线观看 | 色五月成人 | 精品久久久久久亚洲综合网站 | 免费观看国产精品视频 | 日日夜夜狠狠干 | 九九视频网 | 一区二区三区日韩精品 | 国产亚洲一区二区在线观看 | 国产手机视频在线播放 | 国产视频欧美视频 | 国产精品福利午夜在线观看 | 国产美女视频网站 | 免费99精品国产自在在线 | 特级毛片aaa | 国产精品免费大片视频 | 99久久精品国产免费看不卡 | 色婷婷激情五月 | 色婷婷综合久久久久 | 又爽又黄又无遮挡网站动态图 | 丁香久久婷婷 | 中文字幕日本特黄aa毛片 | 免费观看www视频 | 日韩av中文字幕在线免费观看 | 在线观看国产一区二区 | 999在线观看视频 | 色婷婷久久 | 免费av网址大全 | 精品国产电影一区 | 美女国内精品自产拍在线播放 | 美女网站视频免费都是黄 | 精品视频免费在线 | 久久理论电影网 | 国产亚洲欧美日韩高清 | 亚洲电影久久久 | 亚洲在线视频免费观看 | 欧美超碰在线 | 99国产成+人+综合+亚洲 欧美 | 国精产品999国精产品岳 | 中文字幕色站 | 亚洲精品综合在线 | 国内精自线一二区永久 | 国产91全国探花系列在线播放 | 欧美激情综合五月色丁香 | 蜜臀一区二区三区精品免费视频 | 在线观看欧美成人 | 欧美 激情在线 | 日韩在线网址 | 91久久奴性调教 | 亚洲精品一区二区三区在线观看 | 97超碰人人模人人人爽人人爱 | 久久久一本精品99久久精品 | 97视频资源| av丁香花| 四季av综合网站 | 国产精品免费观看在线 | 欧美日韩精品免费观看视频 | 国产亚洲精品久久久久久移动网络 | 国产黄色av影视 | 亚洲综合小说电影qvod | 久久国产品| 国产99免费视频 | 最新av免费在线 | 在线观看视频你懂得 | 久久成人一区二区 | 国产视频在线看 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 欧美二区三区91 | 五月开心色 | 男女精品久久 | 国产一区二区精品久久 | 欧美日韩成人一区 | 综合网在线视频 | 99久久99久久精品国产片果冰 | 视频在线观看入口黄最新永久免费国产 | 在线免费观看av网站 | 射综合网| 深爱激情婷婷网 | 欧美极品裸体 | 免费国产视频 | 久久这里只有精品9 | 青青久草在线 | 日本三级人妇 | 91精品国产麻豆 | 成人动态视频 | 亚洲视频一 | 亚洲人成人在线 | 四虎影视成人永久免费观看视频 | 国产精品久久久久久久久久99 | 日韩精品久久久 | 久久伊人爱| 亚洲影院国产 | 色婷婷免费视频 | 日本在线观看一区二区 | 国产人成看黄久久久久久久久 | 黄色一级大片在线观看 | 久久综合九色综合网站 | 国产精品久久久久久久久搜平片 | 久久99在线| 中文字幕av在线免费 | 91av在线视频播放 | 久久手机免费观看 | 青草视频免费观看 | 亚洲精品在线国产 | 九九在线视频 | 免费看污的网站 | 欧美精品在线观看免费 | 在线视频 成人 | 免费看日韩 | 成人久久免费视频 | 四虎影院在线观看av | 成人av在线资源 | 国产综合精品久久 | 青青草国产成人99久久 | 亚洲日韩欧美一区二区在线 | 国产韩国日本高清视频 | 美女黄频视频大全 | 精品一区中文字幕 | 国产99久久99热这里精品5 | 亚洲人在线视频 | 六月激情丁香 | 免费能看的av | 热99在线| 久久久久国 | 日韩精品一区不卡 | 999国内精品永久免费视频 | av黄色亚洲| 国产精品精品国产色婷婷 |