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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ primer 第10章 泛型算法

發布時間:2023/12/13 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ primer 第10章 泛型算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概述
    • find
    • count
  • 初識泛型算法
    • 只讀算法
      • 只讀算法accumulate
      • 只讀算法equal
    • 寫容器元素的算法
      • 算法fill
      • 算法fill_n
      • back_inserter
      • 算法copy
      • 算法replace replace_copy
    • 重排容器元素的算法
      • sort
      • unique
      • unique_copy
  • 定制操作
    • 向算法傳遞函數
      • 謂詞
      • 算法stable_sort
      • 算法partition
    • lambda表達式
      • lambda介紹
      • 算法find_if
      • 算法for_each
    • lambda捕獲和返回
      • 值捕獲
      • 引用捕獲
      • 隱式捕獲
      • 可變lambda
      • 指定lambda返回類型
      • 算法count_if
    • 參數綁定
      • 標準庫bind函數
      • placeholders名字
      • bind的參數
      • bind重排參數順序
      • 綁定引用參數
  • 再探迭代器
    • 插入迭代器
      • back_insert示例代碼:
      • front_inserter示例代碼
      • inserter示例代碼
    • iostream迭代器
      • istream_iterator操作
      • 使用算法操作流迭代器
      • ostream_iterator操作
      • 使用流迭代器處理類類型
      • 使用流迭代器讀取一個文本文件,存入一個vector中的string里
      • 一個輸入文件,兩個輸出文件,讀取輸入文件,將奇數寫入輸出文件一,將偶數寫入輸出文件二
    • 反向迭代器
      • 反向迭代器轉換為普通迭代器
  • 泛型算法結構
    • 5類迭代器
    • 算法形參模式
      • 接受單個目標迭代器的算法
      • 接受第二個輸入序列的算法
    • 算法命名規范
  • 特定容器算法
    • list和forward_list成員函數版本的算法
      • merge()示例代碼
      • unique()示例代碼
    • splice成員
      • list示例代碼:
      • forward_list示例代碼:

概述

標準庫并未給每個容器添加大量功能,而是提供了一組算法,這些算法中的大多數都獨立于任何特定的容器,這些算法是通用的:它們可用于不同類型的容器和不同類型的元素。

大多數算法都定義在頭文件algorithm中。標準庫還在頭文件numeric中定義了一組數值泛型算法。

find

查找是否存在val,返回的是指向第一個出現val的迭代器,若不存在val,則返回container.end()

find(container.begin(),container.end(),val)

find_if算法可用來查找第一個具有特定大小的元素,接受一對迭代器,表示一個范圍。但與find不同的是,find_if的第三個參數是一個謂詞。

count

返回val出現的次數

count(container.begin(),container.end(),val)

初識泛型算法

只讀算法

一些算法只會讀取其輸入范圍內的元素,而從不改變元素。
對于只讀算法,通常最好使用cbegin()和cend(),但如果要使用算法返回的迭代器來改變元素的值,就需要使用begin()和end()作為參數。
只讀算法例如,find,count,accumulate

只讀算法accumulate

accumulate定義在頭文件numeric中,下示代碼表示對vec中的元素求和,和的初值是0

int sum = accumulate(vec.begin(),vec.end(),0);

accumulate第三個參數的類型決定了函數中使用哪個加法運算符以及返回值的類型。

string sum = accumulate(vec.begin(),vec.end(),string(""));

只讀算法equal

用于確定兩個序列是否保存相同的值。它將第一個序列中的每個元素與第二個序列中的對應元素進行比較,如果所有元素都對應相等,則返回true,否則返回false。equal可以用來比較兩個不同類型的容器中的元素,而且元素類型也不必一樣,只要能用==來比較兩個元素類型即可。 例如,vec可以是vector<string>,vec2可以是list<const char*>。

equal(vec.begin(),vec.end(),vec2.begin())

equal基于一個重要的假設:假定第二個序列至少與第一個序列一樣長,此算法要處理第一個序列中的每個元素,它假定每個元素在第二個序列中都有一個與之對應的元素。

vector<int>v1{1,3,5,7,9}; vector<int>v2{ 1,3,5,7,9,2,4,6 }; equal(v1.begin(),v1.end(),v2.begin());//truevector<int>v3{2,1,3,5,7,9,2,4,6 }; equal(v1.begin(),v1.end(),v3.begin());//false equal(v1.begin(),v1.end(),v3.begin()+1);//true

寫容器元素的算法

一些算法將新值賦予序列中的元素。當我們使用這類算法時,必須注意確保序列原大小至少不小于我們要求算法寫入的元素數目。算法不會執行容器操作,因此它們自身不可能改變容器的大小。一些算法會自己向輸入范圍寫入元素,這些算法本質上并不危險,它們最多寫入與給定序列一樣多的元素。

算法fill

下示代碼表示將輸入范圍中的每一個元素都設置為10

fill(vec.begin(),vec.end(),10)

算法fill_n

從vec.begin()開始的n個元素設置為val,其中容器vec的大小至少為n

fill_n(vec.begin(),n,val)

back_inserter

插入迭代器是一種向容器中添加元素的迭代器。
back_inserter定義在頭文件Iterator中,接受一個指向容器的引用,返回一個與該容器綁定的插入迭代器。通過此迭代器賦值時,賦值運算符會調用push_back將一個具有給定值的元素添加到容器中。

vector<int>vec{1,3,5,7,9};auto it = back_inserter(vec);fill_n(it,10,5);for (auto a : vec) {cout << a << " ";}cout << endl;

輸出結果為:

1 3 5 7 9 5 5 5 5 5 5 5 5 5 5

由于傳入的參數是插入迭代器,因此每次賦值都會在vec上調用push_back,最終向vec的末尾添加了10個元素,每個元素的值都是5。

算法copy

將輸入范圍中的元素拷貝到v2中,v2至少要包含與輸入序列一樣多的元素。
copy返回的是拷貝到v2尾元素之后的位置。

auto iter=copy(v1.begin(),v1.end(),v2.begin());

示例代碼

vector<int>vec{1,3,5,7,9};vector<int>vec2{ 1,2,3,4,5,6,7,8,9};auto it = copy(vec.begin(), vec.end(), vec2.begin());for (auto a : vec2) {cout << a << " ";}cout << endl;cout <<*it<< endl;

輸出結果:

1 3 5 7 9 6 7 8 9 6

算法replace replace_copy

將輸入序列中值為0的元素改為42

replace(vec.begin(), vec.end(),0,42);

如果希望保留原序列不變,可以調用 replace_copy

replace_copy(vec.begin(), vec.end(),back_inserter(vec2),0,42);

示例代碼一:

vector<int>vec{1,3,5,7,9};vector<int>vec2;replace_copy(vec.begin(), vec.end(), back_inserter(vec2), 3, 42);for (auto a : vec2) {cout << a << " ";}cout << endl; 輸出結果: 1 42 5 7 9

示例代碼二:

vector<int>vec{1,3,5,7,9};vector<int>vec2{ 1,2,3,4,5,6,5,8,9};replace(vec2.begin(), vec2.end(), 5,10);replace_copy(vec.begin(), vec.end(), back_inserter(vec2), 3, 42);for (auto a : vec2) {cout << a << " ";}cout << endl;輸出結果:此處插入迭代器調用push_back 1 2 3 4 10 6 10 8 9 1 42 5 7 9

重排容器元素的算法

某些算法會重排容器中元素的順序。

sort

sort是利用元素類型的<運算符來實現排序的。

sort(vec.begin(), vec.end());

sort還可接受第三個參數,此參數是一個謂詞,以此來重載sort的默認行為。

unique

要求源容器中,重復元素相鄰存放,返回最后一個不重復元素之后的位置

auto end_unique=unique(vec.begin(), vec.end());

示例代碼:

vector<int>vec{1,3,5,7,9,3,5,2,7,4};sort(vec.begin(), vec.end());cout << "sort后:";for (auto a : vec) {cout << a << " ";}cout << endl;auto it = unique(vec.begin(), vec.end());cout << "unique后:";for (auto a : vec) {cout << a << " ";}cout << endl;cout << "unique返回的迭代器指向的元素:" << *it << endl;vec.erase(it,vec.end());cout << "erase后:";for (auto a : vec) {cout << a << " ";}cout << endl; sort后:1 2 3 3 4 5 5 7 7 9 unique后:1 2 3 4 5 7 9 7 7 9 unique返回的迭代器指向的元素:7 erase后:1 2 3 4 5 7 9

從輸出結果可以看出,此例重復元素是3,5,7,unique后:1 2 3 4 5 7 9 7 7 9,而最后三個元素是7 7 9不是3 5 7,此處是由算法決定的。unique只是返回最后一個不重復元素之后的位置。

unique_copy

要求源容器中,重復元素相鄰存放

auto end_unique=unique_copy(vec.begin(), vec.end(),vec2.begin());

示例代碼:

vector<int>vec{1,3,5,7,9,3,7,2,5};list<int>lst;sort(vec.begin(), vec.end());unique_copy(vec.begin(),vec.end(),back_inserter(lst));for (auto a : lst) {cout << a << " ";}

輸出結果:

1 2 3 5 7 9

定制操作

向算法傳遞函數

謂詞

謂詞是一個可調用的表達式,其返回結果是一個能用作條件的值。
一元謂詞:只接受單一參數。
二元謂詞:有兩個參數。
接受謂詞參數的算法對輸入序列中的元素調用謂詞,因此,元素類型必須能轉換為謂詞的參數類型。
示例:

bool isShorter(const string &s1,const string &s2){return s1.size()<s2.size(); } //按長度由短至長排序words sort(words.begin(),words.end(),isShorter);

算法stable_sort

穩定排序算法,維持相等元素的原有順序。

stable_sort(words.begin(),words.end(),isShorter);

算法partition

對容器內容按謂詞進行劃分,使得謂詞為true的值會排在容器的前半部分, 使得謂詞為false的值會排在容器的后半部分。算法返回一個迭代器,指向最后一個使謂詞為true的元素之后的位置。

auto it=partition(vec.begin(),vec.end(),謂詞);

測試代碼:

bool bigThan5(const string & s) {return s.size() >= 5; } void test1013() {vector<string>vec{"hellol","ha","hou","hello1w", "hi","hellob", "hellocd", };auto it=partition(vec.begin(),vec.end(),bigThan5);auto beg = vec.begin();while (beg!=it) {cout << *beg << " ";beg++;}cout << endl;cout << "vec:";for (auto a : vec) {cout << a << " ";}cout << endl; }

輸出結果:

hellol hellocd hellob hello1w vec:hellol hellocd hellob hello1w hi hou ha

lambda表達式

lambda介紹

一個lambda表達式表示一個可調用的代碼單元,我們可將其理解為一個未命名的內聯函數。與任何函數類似,一個lambda具有一個返回類型、一個參數列表和一個函數體。但與函數不同,lambda可能定義在函數內部,一個lambda表達式具有如下形式:
[捕獲列表](參數列表)->返回類型{函數體}

其中,捕獲列表是一個lambda所在函數中定義的局部變量的列表(通常為空)。
我們可以忽略參數列表和返回類型,但必須永遠包含捕獲列表和函數體。
示例中定義了一個可調用對象f,它不接受參數,返回42

auto f = [] {return 42;};

lambda的調用方式與普通函數的調用方式相同,都是使用調用運算符:

cout<<f()<<endl;//打印42

如果忽略返回類型,lambda根據函數體中的代碼推斷出返回類型。如果函數體只是一個return語句,則返回類型從返回的表達式的類型推斷而來。如果lambda 的函數體包含任何單一return語句之外的內容,且未指定返回類型,則返回void。

算法find_if

find_if算法對輸入序列中的每個元素調用給定的謂詞,返回第一個使謂詞返回非0值的元素,如果不存在這樣的元素,則返回尾后迭代器。
find_if接受一元謂詞——我們傳遞給它的任何函數都必須嚴格接受一個參數,以便能用來自輸入序列中的一個元素調用它。
如果我們想使用find_if算法來查找第一個具有特定大小的元素。則我們需要接受一個string和一個長度。因此,此處可以使用上述介紹的lambda表達式。

auto wc = find_if(words.begin(),words.end(),[sz](const string &a){return a.size()>=sz;});

這里對find_if的調用返回一個迭代器,指向第一個長度不小于給定參數sz的元素,如果這樣的元素不存在,則返回words.end()的一個拷貝。

算法for_each

對輸入序列中的元素進行打印

for_each(vec.begin(),vec.end(),[](const string &s){cout<<s<<" ";});

此處lambda 的捕獲列表為空,但卻使用了cout,是因為一個lambda可以直接使用定義在當前函數之外的名字。
捕獲列表只用于局部非static變量,lambda可以直接使用局部static變量和在它所在函數之外聲明的名字。

lambda捕獲和返回

類似參數傳遞,變量的捕獲方式也可以是值或引用。

值捕獲

與傳值參數類似,采用值捕獲的前提是變量可以拷貝。與參數不同,被捕獲的變量的值是在lambda創建時拷貝,而不是調用時拷貝:

int a=10; auto f=[a]{return a;}; a=5; auto j=f();//j=10

引用捕獲

int a=10; auto f=[&a]{return a;}; a=5; auto j=f();//j=5

當以引用方式捕獲一個變量時,必須保證在lambda執行時變量是存在的。
我們可以從一個函數返回lambda。函數可以直接返回一個可調用對象,或者返回一個類對象,該類含有可調用對象的數據成員。如果函數返回一個lambda,則與函數不能返回一個局部變量的引用類似,此lambda也不能包含引用捕獲。

隱式捕獲

sz為隱式捕獲,值捕獲方式

auto wc = find_if(words.begin(),words.end(),[=](const string &a){return a.size()>=sz;});

os為隱式捕獲,引用捕獲方式

for_each(vec.begin(),vec.end(),[&](const string &s){os<<s<<" ";});

混合使用隱式捕獲和顯式捕獲
當混合使用隱式捕獲和顯式捕獲時,顯式捕獲的變量必須使用與隱式捕獲不同的方式。即,如果隱式捕獲是引用方式(使用了&),則顯式捕獲命名變量必須采用值方式,因此不能在其名字前使用&。類似的,如果隱式捕獲是值方式(采用了=),則顯式捕獲命名變量必須采用引用方式,即在名字前使用& 。
示例:c隱式捕獲,值捕獲方式,os顯式捕獲,引用捕獲方式

for_each(vec.begin(),vec.end(),[=,&os](const string &s){os<<s<<c;});

可變lambda

默認情況下,對于一個值被拷貝的變量,lambda不會改變其值,如果我們希望能改變一個被捕獲的變量的值,就必須在參數列表后加上關鍵字mutable。因此,可變lambda能省略參數列表。
若不加關鍵字mutable,在下述代碼中, ++a會報錯。

int a = 10;auto f = [a]()mutable {return ++a; };auto j = f();cout << "a:" << a << endl; //a=10cout << "j:" << j << endl; //j=11

示例:

void test() {int num = 5;auto f = [num]()mutable->bool {if (num == 0)return true; num--; cout <<" f()的num:"<< num <<" "; return false; };for (int i = 0; i < 6;i++) {cout << "test中的num:"<<num<<" ";cout << f() << endl;}}

輸出結果:

test中的num:5 f()的num:4 0 test中的num:5 f()的num:3 0 test中的num:5 f()的num:2 0 test中的num:5 f()的num:1 0 test中的num:5 f()的num:0 0 test中的num:5 1

指定lambda返回類型

當我們需要為一個lambda定義返回類型時,必須使用尾置返回類型。
示例代碼:

transform(vi.begin(),vi.end(),vi.begin(), [](int i)->int {if(i<0)return -i; else return i;});

算法count_if

接受一對迭代器表示一個輸入范圍,還接受一個謂詞,對輸入范圍中每個元素執行,count_if返回一個計數值,表示謂詞有多少次為真。

參數綁定

如果lambda的捕獲列表為空,通常可以用函數來代替它。

標準庫bind函數

bind函數定義在頭文件functional中。bind函數可看做一個通用的函數適配器,它接受一個可調用對象,生成一個新的可調用對象來“適應”原對象的參數列表。
調用bind 的一般形式:

auto newCallable=bind(callable,arg_list)

其中,newCallable本身是一個可調用對象,arg_list是一個逗號分隔的參數列表,對應給定的callable的參數,即,當我們調用newCallable時,newCallable會調用callable,并傳遞給它arg_list中的參數。
arg_list中的參數可能包含形如_n的名字,其中n是一個整數。這些參數是“占位符”,表示newCallable的參數,它們占據了傳遞給newCallable的參數的“位置”。數值n表示生成的可調用對象中參數的位置:_1為newCallable的第一個參數,_2為newCallable的第二個參數,以此類推。
示例代碼:

auto check6=bind(check_size,_1,6); string s="hello"; check6(s);//會調用 check_size(s,6);

將原來基于lambda 的find_if版本:

auto wc = find_if(words.begin(),words.end(),[sz](const string &a){return a.size()>=sz;});

替換為如下bind版本:

auto wc = find_if(words.begin(),words.end(),bind(check_size,_1,sz));

當find_if對words中的string調用這個對象時,這些對象會調用check_size,將給定的string和sz傳遞給它。因此,find_if可以有效地對輸入序列中每個string調用check_size,實現string的大小與sz的比較。

placeholders名字

名字_n都定義在一個名為placeholders的命名空間中,而這個命名空間本身定義在std命名空間中,例如,_1對應的using聲明為:

using std::placeholders::_1
由placeholders定義的所有名字都可用的聲明:
using namespace std::placeholders
與bind函數一樣,placeholders命名空間也定義在functional頭文件中。

bind的參數

auto g=bind(f,a,b,_2,c,_1);

調用g(x,y)會調用f(a,b,y,c,x)

bind重排參數順序

按單詞長度由短至長排序
sort(words.begin(),words.end(),isShorter);

按單詞長度由長至短排序
sort(words.begin(),words.end(),bind(isShorter,_2,_1));
在第一個調用中,當sort需要比較兩個元素A和B時,它會調用isShorter(A,B)。在第二個對sort的調用中,傳遞給isShorter的參數被交換,因此比較兩個元素時,就好像調用isShorter(B,A)一樣。

綁定引用參數

默認情況下,bind的那些不是占位符的參數被拷貝到bind返回的可調用對象中,但是有時對有些綁定的參數我們希望以引用方式傳遞,或是要綁定參數的類型無法拷貝,我們就必須使用標準庫ref函數
錯誤用法:for_each(words.begin(),words.end(),bind(print,os,_1,' '));
正確用法:for_each(words.begin(),words.end(),bind(print,ref(os),_1,' '));

函數ref返回一個對象,包含給定的引用,此對象是可以拷貝的,標準庫中還有一個cref函數,生成一個保存const引用的類。與bind一樣,函數ref和cref也定義在頭文件functional中。

再探迭代器

  • 插入迭代器:這些迭代器被綁定到一個容器上,可用來向容器插入元素。
  • 流迭代器:這些迭代器被綁定到輸入或輸出流上,可用來遍歷所關聯的IO流。
  • 反向迭代器:這些迭代器向后而不是向前移動。除了forward_list之外的標準庫容器都有反向迭代器。
  • 移動迭代器:這些專用的迭代器不是拷貝其中的元素,而是移動它們。此迭代器第13章進行介紹。

插入迭代器

插入器是一種迭代器適配器,它接受一個容器,生成一個迭代器,能實現向給定容器添加元素。當我們通過一個插入迭代器進行賦值時,該迭代器調用容器操作來向給定容器的指定位置插入一個元素。

back_insert示例代碼:

list<int>lst = { 1,2,3,4 };auto it = back_inserter(lst);for (int i = 5; i < 10;i++) {*it = i;}for (auto a:lst) {cout << a << " ";}

輸出結果:

1 2 3 4 5 6 7 8 9

調用push_back

front_inserter示例代碼

list<int>lst = { 1,2,3,4 };auto it = front_inserter(lst);for (int i = 5; i < 10;i++) {*it = i;}for (auto a:lst) {cout << a << " ";}

輸出結果:

9 8 7 6 5 1 2 3 4

調用push_front

inserter示例代碼

list<int>lst = { 1,2,3,4 };auto it = inserter(lst,lst.begin());for (int i = 5; i < 10;i++) {*it = i;}for (auto a:lst) {cout << a << " ";}

輸出結果

5 6 7 8 9 1 2 3 4

示例代碼中,
*it = i;相當于 it=lst.insert(it,i);++it;
即一直是在原來元素的位置之前加入新的元素。

iostream迭代器

雖然iostream類型不是容器,但標準庫定義了可以用于這些IO類型對象的迭代器。istream_iterator讀取輸入流,ostream_iterator向一個輸出流寫數據。這些迭代器將它們對應的流當做一個特定類型的元素序列來處理。通過使用流迭代器,我們可以用泛型算法從流對象讀取數據以及向其寫入數據。

istream_iterator操作

當創建一個流迭代器時,必須指定迭代器將要讀寫的對象類型。一個istream_iterator使用>>來讀取流。因此,istream_iterator要讀取的類型必須定義了輸入運算符。
當創建一個istream_iterator時,我們可以將它綁定到一個流:
istream_iterator<int>int_it(cin); //從cin讀取int

我們還可以默認初始化迭代器,這樣就創建了一個可以當作尾后值使用的迭代器:
istream_iterator<int>int_eof; //尾后迭代器

下面是一個用istream_iterator從標準輸入讀取數據,存入一個vector的例子:

istream_iterator<int>in_iter(cin);//從cin讀取int istream_iterator<int>int_eof; //尾后迭代器 while(in_iter!=int_eof)vec.push_back(*in_iter++);

該程序可重寫為如下形式:

istream_iterator<int>in_iter(cin);//從cin讀取int istream_iterator<int>int_eof; //尾后迭代器 vector<int>vec(in_iter,int_eof);//從迭代器范圍構造vec

我們可以用一對表示元素范圍的迭代器來構造vec。這兩個迭代器是istream_iterator,這意味著元素范圍是通過從關聯的流中讀取數據獲得的。這個構造函數從cin中讀取數據,直至遇到文件尾或者遇到一個不是int的數據為止。從流中讀取的數據被用來構造vec。

使用算法操作流迭代器

由于算法使用迭代器操作來處理數據,而流迭代器又至少支持某些迭代器操作,因此我們至少可以用某些算法來操作流迭代器。
示例,我們可以用一對istream_iterator來調用accumulate:

istream_iterator<int>in(cin), eof; cout << accumulate(in, eof, 0) << endl;

若輸入為1 3 5 7 9
則輸出為25,此調用會計算出從標準輸入讀取的值的和。

ostream_iterator操作

我們可以對任何具有輸出運算符(<<運算符)的類型定義ostream_iterator。當創建一個ostream_iterator時,我們可以提供(可選的)第二參數,它是一個字符串,在輸出每個元素后都會打印此字符串。此字符串必須是一個C風格字符串(即,一個字符串常量或者一個指向以空字符結尾的字符數組的指針)。必須將ostream_iterator綁定到一個指定的流,不允許空的或表示尾后位置的ostream_iterator。

示例代碼:

ostream_iterator<int>out_iter(cout," ");vector<int>vec{1,3,5,7,9};for (auto a:vec) {*out_iter++ = a;}cout << endl;

輸出:

1 3 5 7 9

此處* 和++實際上對ostream_iterator對象不做任何事情,可以寫作out_iter = a;但仍然推薦*out_iter++ = a;這種寫法, 因為這種寫法,流迭代器的使用與其他迭代器的使用保持一致。
可以通過調用copy來打印vec中的元素,這比編寫循環更簡單:

ostream_iterator<int>out_iter(cout," "); vector<int>vec{1,3,5,7,9}; copy(vec.begin(),vec.end(),out_iter); cout<<endl;

輸出:

1 3 5 7 9

使用流迭代器處理類類型

我們可以為任何定義了輸入運算符>>的類型創建istream_iterator對象,類似的,只要類型有輸出運算符<<,我們就可以為其定義ostream_iterator。

使用流迭代器讀取一個文本文件,存入一個vector中的string里

ifstream in("test.txt");istream_iterator<string>in_iter(in),eof;ostream_iterator<string>out_iter(cout," ");vector<string>vec(in_iter,eof);copy(vec.begin(), vec.end(), out_iter);cout << endl;

一個輸入文件,兩個輸出文件,讀取輸入文件,將奇數寫入輸出文件一,將偶數寫入輸出文件二

void test1033(string &s1, string &s2, string &s3) {ifstream in(s1);ofstream ofs1(s2);ofstream ofs2(s3);istream_iterator<int>in_iter(in), eof;ostream_iterator<int>out1(ofs1, " ");ostream_iterator<int>out2(ofs2, " ");while (in_iter!=eof) {if (*in_iter % 2 == 1) {*out1++ = *in_iter;}else {*out2++ = *in_iter;}in_iter++;} }

反向迭代器

反向迭代器就是在容器中從尾元素向首元素反向移動的迭代器。對于反向迭代器,遞增(以及遞減)操作的含義會顛倒過來。遞增一個反向迭代器會移動到前一個元素,遞減會移動到下一個元素。除了forward_list之外,其他容器都支持反向迭代器。通過調用rbegin、rend、crbegin、crend成員函數來獲得反向迭代器。
我們只能從既支持++也支持–的迭代器來定義反向迭代器,因為反向迭代器的目的是在序列中反向移動。

示例代碼:

vector<int>vec = {1,3,5,7,2,4,6,8};for (auto it = vec.crbegin(); it != vec.crend();++it) {cout << *it << " ";}

輸出結果:

8 6 4 2 7 5 3 1

通過向sort傳遞一對反向迭代器來將vector整理為遞減序:

vector<int>vec = {1,3,5,7,2,4,6,8};sort(vec.begin(),vec.end());for (auto a : vec) {cout << a << " ";}cout << endl;sort(vec.rbegin(), vec.rend());for (auto a : vec) {cout << a << " ";}

輸出結果:

1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1

反向迭代器轉換為普通迭代器

調用base成員函數即可

反向迭代器的目的是表示元素范圍,而這些范圍是不對稱的,這導致一個重要的結果:當我們從一個普通迭代器初始化一個反向迭代器,或是給一個反向迭代器賦值時,結果迭代器與原來迭代器指向的并不是相同的元素。示例代碼如下:

string s = "hello,world,last";auto it = s.rbegin();it++; //此時it指向last中的s*it = 'A';cout << s << endl;//輸出結果為hello,world,laAt string s = "hello,world,last";auto it = s.rbegin();it++;auto it2 = it.base();//此時it2指向last中的t*it2 = 'A';cout << s << endl;//輸出結果為hello,world,lasA

例如,查找某以逗號分隔的string中的最后一個單詞的示例代碼如下:

string s = "hello,world,last";auto it1 = find(s.begin(),s.end(),',');cout << "第一個單詞:"<<string(s.begin(),it1) <<endl;auto it2 = find(s.rbegin(), s.rend(), ',');cout << "最后一個單詞錯誤的方式:" << string(s.rbegin(), it2) << endl;cout << "最后一個單詞正確的方式:" << string(it2.base(),s.end()) << endl;

輸出結果:

第一個單詞:hello 最后一個單詞錯誤的方式:tsal 最后一個單詞正確的方式:last

泛型算法結構

5類迭代器



算法形參模式

接受單個目標迭代器的算法

dest參數是一個表示算法可以寫入的目的位置的迭代器,算法假定:按其需要寫入數據,不管寫入多少個元素都是安全的。
如果dest是一個直接指向容器的迭代器,那么算法將輸出數據寫到容器中已存在的元素內,更常見的情況,dest被綁定到一個插入迭代器或是一個ostream_iterator。

接受第二個輸入序列的算法

算法命名規范

  • 一些算法使用重載形式傳遞一個謂詞
  • _if版本的算法可接受謂詞參數
  • 區分拷貝元素的版本和不拷貝的版本
    • 默認情況下,重排元素的算法將重排后的元素寫回給定的輸入序列中。這些算法還提供另一個版本,將元素寫到一個指定的輸出目的位置。寫到額外目的空間的算法都在名字后面附加一個_copy。
    • 一些算法同時提供_copy和_if版本,這些版本接受一個目的位置迭代器和一個謂詞。

示例代碼如下:

reverse(beg,end) 反轉輸入范圍中元素的順序 reverse_copy(beg,end,dest) 將元素按逆序拷貝到dest remove_if(vec.begin(),vec.end(),[](int i){return i%2;}) reverse_copy_if(vec.begin(),vec.end(),back_inserter(vec2),[](int i){return i%2;})

特定容器算法

list和forward_list成員函數版本的算法


merge()示例代碼

lst和lst2必須是有序的,經merge后,lst2為空,lst為1 2 3 4 5 6 7 8 9 10

list<int>lst{1,3,5,7,10};list<int>lst2{ 2,4,6,8,9 };lst.merge(lst2);

unique()示例代碼

list中重復元素相鄰,調用unique()即可刪除同一個值的連續拷貝,如下代碼,調用unique()后lst為1 2 3 4

list<int>lst{1,2,2,3,3,3,4};lst.unique();

splice成員

list示例代碼:

list<int>lst{1,3,5,7,10 };list<int>lst2{ 2,4,6,8,9 };lst.splice(lst.begin(),lst2);//lst=2 4 6 8 9 1 3 5 7 10 list<int>lst{1,3,5,7,10 };list<int>lst2{ 2,4,6,8,9 };lst.splice(lst.begin(),lst2,lst2.begin());//lst=2 1 3 5 7 10 list<int>lst{1,3,5,7,10 };list<int>lst2{ 2,4,6,8,9 };lst.splice(lst.begin(),lst2,lst2.begin(), lst2.end());//lst=2 4 6 8 9 1 3 5 7 10

forward_list示例代碼:

forward_list<int>flst{1,3,5,7,10 };forward_list<int>flst2{ 2,4,6,8,9 };flst.splice_after(flst.begin(),flst2);//flst=1 2 4 6 8 9 3 5 7 10

以下代碼,it指向元素6,將6之后的元素8移動到flst中:

forward_list<int>flst{1,3,5,7,10 };forward_list<int>flst2{ 2,4,6,8,9 };auto it=flst2.begin();it++;it++;flst.splice_after(flst.begin(),flst2, it);//flst: 1 8 3 5 7 10//flst2: 2 4 6 9 forward_list<int>flst{1,3,5,7,10 };forward_list<int>flst2{ 2,4,6,8,9 };flst.splice_after(flst.begin(),flst2, flst2.begin(), flst2.end());//flst: 1 4 6 8 9 3 5 7 10 flst2: 2 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的C++ primer 第10章 泛型算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

丁香网五月天 | 在线播放国产精品 | 久久国产精品视频免费看 | 91大神精品视频在线观看 | av成人在线观看 | 亚洲1区在线 | 亚洲免费色 | 在线观看国产一区二区 | 欧美日韩性 | 午夜在线观看一区 | 一区二区三区精品在线视频 | 日韩av进入 | 亚洲国产经典视频 | 亚洲天天草| 高潮久久久久久 | 色橹橹欧美在线观看视频高清 | 成人av免费在线播放 | 午夜国产在线观看 | 九九视频免费观看视频精品 | 亚洲精品福利在线 | 日韩成片 | 在线a人v观看视频 | 久久草av | 探花视频在线版播放免费观看 | 97色视频在线 | 成人久久视频 | 91精品国产电影 | 日韩网站免费观看 | 日韩精品免费在线视频 | 特级毛片爽www免费版 | www.看片网站 | 成人免费在线观看av | 91亚洲精品久久久久图片蜜桃 | 欧美一区二区在线免费观看 | 成人免费亚洲 | 国产中文字幕视频在线观看 | 午夜三级在线 | 香蕉在线影院 | 国产精品丝袜久久久久久久不卡 | 在线观看免费视频你懂的 | 在线高清av | 中文字幕在线观看资源 | 成人午夜影院 | 黄色小网站在线 | 久久天天躁狠狠躁夜夜不卡公司 | 欧美一级在线 | 国产精品自产拍在线观看桃花 | 日韩欧美国产精品 | 欧洲激情在线 | 99精品在线免费视频 | 精品国产免费观看 | 国产精品99久久久久久久久 | 91久久久国产精品 | 色网站黄 | 色网站免费在线观看 | 欧美极品久久 | 免费在线观看日韩视频 | 一区二区精品在线观看 | 国内精品福利视频 | 日韩av不卡在线观看 | 在线观看亚洲精品 | 天天操夜夜想 | 天天综合网入口 | 999成人网 | 精品久久久久久久久亚洲 | 欧美综合在线视频 | 免费不卡中文字幕视频 | 国产91av视频在线观看 | 麻豆免费精品视频 | 日日骑| 亚洲成a人片综合在线 | 久久综合综合久久综合 | 久久久18 | 国产精品正在播放 | 97视频精品 | www.色午夜| 国产亚洲激情视频在线 | 成人动图| 在线不卡中文字幕播放 | 92国产精品久久久久首页 | 麻豆91精品视频 | 福利视频导航网址 | 在线免费高清一区二区三区 | 婷婷综合av| 亚洲在线不卡 | 麻豆91在线观看 | 亚洲va欧美va人人爽 | 国产视频 久久久 | 久久午夜色播影院免费高清 | 欧美精彩视频在线观看 | 六月色婷婷 | 黄色小说免费在线观看 | 在线观看精品国产 | 久色婷婷 | 九九久久免费 | www.色婷婷 | 99久久精品日本一区二区免费 | 涩涩网站在线观看 | 国产va精品免费观看 | 国产精品系列在线 | 天天操天天干天天操天天干 | 一区二区三区四区精品 | 日本一区二区三区视频在线播放 | 精品国产欧美 | 久久一区精品 | 国产精品成人av久久 | 视频二区| 91丨九色丨蝌蚪丨老版 | 免费亚洲精品视频 | 日韩精品最新在线观看 | 久久久久久黄 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | www.久久成人 | 全久久久久久久久久久电影 | 国产在线精品国自产拍影院 | 久久五月婷婷丁香社区 | 色婷婷亚洲精品 | 天天色播| 91在线资源 | 亚洲综合色av | 九九热有精品 | 黄色av成人在线观看 | 精品视频亚洲 | 在线视频 一区二区 | 国产伦理久久 | 欧洲一区二区三区精品 | 一区二区三区国产欧美 | 国产黄a三级 | 99电影| 亚洲国产精品999 | 成片免费 | 日韩精品久久久久久久电影竹菊 | 黄色资源网站 | 欧美五月婷婷 | 亚洲a免费| 能在线看的av| 99视频在线精品国自产拍免费观看 | 久久久久中文 | 天天干天天草 | 久久久久久久久久影视 | 日本爱爱免费 | 国产视频2区 | 国产成人精品一区二 | av资源在线观看 | 欧美一级网站 | 国产成人精品午夜在线播放 | 日韩欧美国产精品 | 欧美一级免费黄色片 | 人人爱人人射 | 一区视频在线 | 胖bbbb搡bbbb擦bbbb| 国产资源网站 | 久久久久97国产 | 天天爽天天爽夜夜爽 | 亚洲草视频| av高清一区| 色天堂在线视频 | 成人免费在线视频 | 91久久偷偷做嫩草影院 | 激情网站 | 98精品国产自产在线观看 | 久久99久久99精品 | 国产亚洲精品美女 | 一区二区三区视频 | 国产免费一区二区三区最新 | 国产视频日本 | 天天操天天是 | 午夜在线免费视频 | 日免费视频 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | av色综合 | 日韩av电影国产 | 日韩免费观看一区二区 | 国产高清视频在线观看 | 亚洲一级久久 | 欧美成人亚洲成人 | 欧美日本高清视频 | 一级黄色网址 | 亚洲国产日韩一区 | 精品国产一区二区三区四区在线观看 | 不卡的一区二区三区 | 国产韩国精品一区二区三区 | 九九久久视频 | 中文字幕 成人 | 99久热在线精品视频观看 | 亚洲国产欧美一区二区三区丁香婷 | 97在线观看免费视频 | 精品夜夜嗨av一区二区三区 | 香蕉视频最新网址 | 69视频在线播放 | 九九免费精品视频 | 天天操天天射天天操 | 久久久久在线观看 | 91精品国产亚洲 | a色视频| 久久久久中文 | 日韩三级视频在线观看 | 亚洲欧美色婷婷 | 日韩欧美一区二区三区黑寡妇 | 天天干天天草天天爽 | 99精品久久只有精品 | 亚洲精品高清在线 | av福利网址导航大全 | 99视频在线看| 国产91成人在在线播放 | 激情婷婷 | www.夜夜草| 久久久婷 | 精品伊人久久久 | 亚洲区精品 | 99在线免费视频 | 国内视频1区 | 久久精品中文视频 | 日本激情视频中文字幕 | 毛片网在线观看 | 一区二区三区电影在线播 | 伊人手机在线 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 国产在线视频一区二区 | 在线免费色视频 | 青青啪 | 中文字幕电影高清在线观看 | 亚洲成年人免费网站 | a黄色一级 | 00av视频 | 91豆麻精品91久久久久久 | 福利视频 | av福利网址导航 | 91视频在线观看免费 | 久久激情久久 | 天天鲁一鲁摸一摸爽一爽 | 在线亚洲成人 | 蜜臀精品久久久久久蜜臀 | 欧美 高跟鞋交 xxxxhd | 四虎国产精品免费 | 青青河边草观看完整版高清 | 在线观看免费成人 | 在线播放亚洲激情 | 欧美精品在线免费 | 美女性爽视频国产免费app | 日本精品久久久久影院 | 四虎成人精品永久免费av九九 | 亚洲作爱视频 | 亚洲精品美女久久17c | 久久黄色精品视频 | 免费在线色 | 亚洲三级黄色 | 超碰公开在线观看 | 国产最新在线 | 国产成人一区二区三区影院在线 | 亚洲一一在线 | 日本精品视频在线 | 久久国产美女 | 欧美视频二区 | 黄免费在线观看 | 一级免费观看 | 88av视频 | 91传媒免费观看 | 亚洲视频aaa | 97色噜噜 | 久久久久免费精品国产 | 在线观看免费视频你懂的 | 精品国产免费一区二区三区五区 | 久久五月网 | 玖玖爱免费视频 | 国产精品一区在线观看你懂的 | 综合色爱| 亚洲aⅴ在线 | 国产青青青 | 国产精品黄色在线观看 | 婷婷色网址| 五月天中文字幕 | 9999免费视频 | 天堂网av在线 | 免费看片网页 | 国产在线播放一区 | 精品国产一区二区三区四 | 五月综合激情 | 国产一级视屏 | 成人午夜精品久久久久久久3d | 色多多在线观看 | 亚洲最大av网 | 欧美一二三区在线播放 | 免费人成在线观看 | 国产资源站 | 久久男人免费视频 | 在线中文字幕观看 | 国产性xxxx| 97av在线视频免费播放 | 国产手机在线观看 | 国产热re99久久6国产精品 | 久久久久国产精品免费免费搜索 | 国产xxxx性hd极品 | www.超碰 | 91丨九色丨丝袜 | 99久久精品电影 | 久久精品视频在线观看免费 | а中文在线天堂 | 五月婷婷另类国产 | 久保带人 | 久久综合久久综合久久 | 久久久精品综合 | 精品五月天 | 99视频精品全国免费 | 91在线免费观看国产 | 中文字幕成人在线观看 | 欧美激情综合网 | 亚洲欧美怡红院 | 超碰在线日本 | 免费一级特黄毛大片 | 在线观看你懂的网址 | 国产一线二线三线性视频 | 91爱爱网址 | 午夜精品剧场 | 99视频精品免费视频 | 国产精品99久久久久久久久 | 99精品国产亚洲 | 亚洲高清视频在线观看免费 | 草久在线 | 免费男女羞羞的视频网站中文字幕 | 午夜黄色一级片 | 黄色aaaaa| 日韩中文字幕免费在线播放 | 麻豆视频在线播放 | 国产在线视频导航 | 99热国产在线中文 | 免费色网站 | 亚洲无在线 | 久久爱www. | 人人玩人人添人人 | 99色视频在线 | 91福利在线导航 | 国产精品区免费视频 | 九九热中文字幕 | 国产精品色 | 国产精品福利午夜在线观看 | 久草免费电影 | 91久久人澡人人添人人爽欧美 | 精品视频97 | 一区二区三区免费播放 | 亚洲精品在线观看网站 | 夜色资源站国产www在线视频 | 久久成人免费 | 日韩精品不卡 | 成人免费精品 | 国产精品日韩欧美 | 亚洲一区二区视频在线播放 | 操操综合网 | 欧美精品九九99久久 | 久久在线免费 | 精品视频在线播放 | 99精品国产一区二区三区麻豆 | 超碰在线人人草 | 久久久天堂 | 国内精品久久久久久久久久久 | 91在线蜜桃臀 | 欧美巨大荫蒂茸毛毛人妖 | 成人日韩av | 精品免费观看 | 精品国产美女 | 国产一级视频在线观看 | 国产精品videossex国产高清 | 五月激情亚洲 | 亚洲3级 | 美女福利视频一区二区 | 欧美精品国产综合久久 | 久久成人国产精品免费软件 | 狠狠操导航 | 欧美亚洲另类在线视频 | 在线免费观看涩涩 | 亚洲一级片| 国产专区视频在线观看 | 日韩美在线观看 | 亚洲精选久久 | 日韩精品中文字幕av | 亚洲精品久久久蜜桃 | 91精品啪在线观看国产线免费 | 日韩特黄一级欧美毛片特黄 | 最新久久久 | av在线免费播放 | 日韩久久久久久久久久 | 国产精品24小时在线观看 | 99成人免费视频 | 久久在线观看 | 欧美精品黑人性xxxx | 欧日韩在线视频 | 久久国产精品色av免费看 | 天天躁日日躁狠狠躁av中文 | 久草在在线 | 午夜av在线播放 | 免费av网站在线看 | 国产综合91 | 日韩视频一区二区在线 | 91视频在线网址 | 奇米影视在线99精品 | 亚洲欧美日韩国产一区二区三区 | 久久人人爽视频 | 久久久久国产视频 | 久久久视屏 | 天天操天天射天天 | 国产精品一区二区久久久 | 久久国内免费视频 | 97精品国产97久久久久久久久久久久 | 最近免费中文视频 | 国产精品久久久久久久毛片 | 国内精品久久久久久久久 | 国产精品区二区三区日本 | www黄色 | 国产一级在线播放 | 99久久久国产免费 | 免费色视频网站 | 免费看污的网站 | av资源免费在线观看 | 啪啪资源| 免费看国产a | 一区二区三区免费在线 | 久久精品视频网站 | 国产在线播放一区二区三区 | 热久久免费视频 | 波多野结衣视频一区二区 | 欧美一二区在线 | 色资源在线观看 | 在线观看片 | 国产免费专区 | 999在线观看视频 | 日韩午夜三级 | 91成人免费观看视频 | 精品福利网站 | 国产麻豆电影在线观看 | 91在线小视频| 免费在线观看日韩 | 一区二区精品在线 | 成年人电影毛片 | 亚洲热久久 | 国产视频午夜 | 五月婷婷在线视频观看 | 韩日视频在线 | 国产一区二区三区免费视频 | 天天操天天射天天 | 亚洲成av片人久久久 | 丁五月婷婷 | 欧美久久久久久久久久 | 午夜婷婷在线观看 | 99九九热只有国产精品 | 亚洲综合成人专区片 | 欧美日韩国产色综合一二三四 | 国产又粗又猛又黄又爽视频 | 99热这里有| 精品成人网 | 亚洲h视频在线 | 亚洲欧美怡红院 | 国产精品 日韩精品 | 一区二区不卡在线观看 | 免费在线观看视频a | 中文字幕在线观看完整版 | 韩日色视频 | 亚洲日本一区二区在线 | 亚洲精品免费在线观看视频 | 国产不卡av在线播放 | 天天躁日日躁狠狠躁av麻豆 | 欧美激情第28页 | 2021av在线| 99精品免费视频 | 国产日韩欧美在线影视 | 在线播放精品一区二区三区 | 99久久99久久精品 | 91av视频免费观看 | 午夜 久久 tv | 成人a在线观看 | 欧美一级日韩三级 | 国产原创在线观看 | a在线观看免费视频 | 亚洲国产精品久久 | 黄色影院在线观看 | 六月丁香社区 | 天天色草 | 国产精品99免视看9 国产精品毛片一区视频 | 91成人免费| 国产精品69av| 99视| 最近中文字幕第一页 | 91在线观看视频 | 国产精品24小时在线观看 | 黄网站色视频 | 99久热在线精品视频 | 91九色在线| 国产精品一区二区免费在线观看 | 色哟哟国产精品 | 久久毛片网站 | 精品国产自在精品国产精野外直播 | 91网在线| 99九九99九九九视频精品 | 天天爽天天射 | 麻豆av一区二区三区在线观看 | 日韩精品在线看 | 在线免费av电影 | 又黄又爽又无遮挡免费的网站 | 韩国精品视频在线观看 | 激情视频区 | 成人国产精品一区二区 | 正在播放日韩 | 中国一级片免费看 | 天天久久夜夜 | 在线亚洲午夜片av大片 | a级国产乱理伦片在线观看 亚洲3级 | 1024手机基地在线观看 | 国产一级黄色片免费看 | 免费在线观看一区二区三区 | 欧美成人精品三级在线观看播放 | 日韩欧美国产免费播放 | 人人网av | 成人黄色在线看 | 91麻豆精品国产自产在线 | 日韩在线高清免费视频 | 久久久人人人 | 国产精品一级视频 | 日韩av综合网站 | 99自拍视频在线观看 | 丁香一区二区 | 97超碰免费在线 | 成人毛片网 | 久久久三级视频 | 国产精品毛片久久蜜 | 国产看片免费 | 欧美另类v | 久久久久色 | 亚洲黄色免费在线 | 成人黄在线观看 | 国产日产精品一区二区三区四区 | 国产 日韩 在线 亚洲 字幕 中文 | 99看视频在线观看 | 91资源在线 | 日韩在线视频不卡 | 欧美激情精品 | 天天激情 | 黄色小网站在线 | 久久99热国产 | 成人免费一区二区三区在线观看 | 国产精品99久久久久久有的能看 | 日韩动态视频 | 欧美午夜一区二区福利视频 | 91大神在线看 | 色狠狠干 | 日韩在线第一 | 激情视频一区二区三区 | 欧美激情综合五月色丁香 | 992tv人人网tv亚洲精品 | 蜜臀一区二区三区精品免费视频 | 国色天香av | 日日干天天 | 久草精品电影 | 天天色天天色天天色 | 国产亚洲精品久久久久久 | 久久久久亚洲精品中文字幕 | 久久午夜剧场 | 亚洲欧美成人 | 美女精品 | 日日干影院 | 91激情| 欧美精品一级视频 | 91完整版在线观看 | 五月天丁香亚洲 | 国产资源中文字幕 | 亚洲第一久久久 | 国产录像在线观看 | 国产一二三四在线观看视频 | 久久午夜免费视频 | 精品九九久久 | 欧美亚洲专区 | 日日躁夜夜躁aaaaxxxx | 国产高清av在线播放 | 最近中文字幕在线中文高清版 | 9色在线视频| 人人干,人人爽 | 国产最新福利 | 婷婷国产一区二区三区 | 免费看国产曰批40分钟 | 国产精品video爽爽爽爽 | 色综合天天色综合 | 日韩国产欧美在线视频 | 亚洲激情综合网 | av片一区二区 | 国产免费中文字幕 | 欧美精品国产综合久久 | 人人玩人人添人人 | 久久亚洲视频 | 五月香视频在线观看 | 精品国产一区二区三区在线 | 少妇搡bbbb搡bbb搡aa | 久久久婷 | 91日韩在线专区 | 99久久精品国产系列 | 91看片淫黄大片91 | 九九九九热精品免费视频点播观看 | 麻豆成人网 | 蜜臀av性久久久久av蜜臀三区 | 日韩成人av在线 | 精品一区二区三区香蕉蜜桃 | 亚洲精品在线观 | 日日操日日干 | 日韩在线观看你懂的 | 亚洲精品一区中文字幕乱码 | 欧美日韩在线免费观看视频 | 2019精品手机国产品在线 | 日韩在线精品一区 | 亚洲国产精品成人综合 | 91麻豆精品国产自产 | 亚洲爱视频| 观看免费av| 精品国产亚洲日本 | 亚洲aⅴ一区二区三区 | 国产黄色在线看 | 91在线公开视频 | 在线观看亚洲国产 | 亚洲欧美日韩国产一区二区三区 | 日韩高清在线观看 | 激情久久网 | 一区二区伦理 | 亚洲视频每日更新 | 国产精品美女免费 | 成人片在线播放 | 天天操天天色天天射 | www.com操| 成全在线视频免费观看 | 一级免费av | 国产精品久久久99 | 天天操夜夜操 | 91福利视频免费观看 | 成年人三级网站 | 国产成人精品一区二区三区在线 | 麻豆传媒在线视频 | 天天草综合 | av在线看网站 | 国产在线p| 亚洲理论片在线观看 | 久久久网页 | 日韩专区av | 97av在线视频免费播放 | 91视视频在线直接观看在线看网页在线看 | 在线视频福利 | 精品一区二区三区四区在线 | 国内精品视频免费 | 日批视频在线播放 | 人人爽久久涩噜噜噜网站 | 西西人体4444www高清视频 | 91精品国产电影 | 涩涩网站在线 | 国产视频精品久久 | 久久久久久毛片精品免费不卡 | 精品视频免费在线 | 91av在线播放| 天天操狠狠干 | 婷婷色站| 日韩在线视频不卡 | 激情www | 精品久久九九 | 成人在线观看免费视频 | 69国产精品成人在线播放 | 国产精品第三页 | 99久久一区 | 国产色综合| 亚洲精品国精品久久99热 | 国产精品不卡在线观看 | 国产理论在线 | 日日草av| 亚洲人久久 | 欧美做受xxx | 欧美在线不卡一区 | 91麻豆精品| 国产三级香港三韩国三级 | 99这里只有精品视频 | 成人一区二区在线观看 | 91亚洲网站 | 久草在线免费在线观看 | 人人玩人人添人人澡超碰 | 久99久在线视频 | 亚洲激情五月 | 97日日 | 日本韩国精品一区二区在线观看 | 成人三级网站在线观看 | 国产一区不卡在线 | 精品国产伦一区二区三区免费 | 久久久久国产精品免费 | 久久精品直播 | 欧美日韩中文国产一区发布 | 就要干b | 免费观看黄色12片一级视频 | 在线观看国产 | 欧美一区免费观看 | 91色视频| 久久久久久美女 | 亚洲激情六月 | 中文字幕在线视频一区二区三区 | 精品视频资源站 | 久久婷婷国产 | 91福利视频免费观看 | 中文字幕日本在线 | 久久高清| 又黄又爽的免费高潮视频 | 中文字幕电影一区 | 成年人免费看片网站 | 免费下载高清毛片 | 久久免费视频国产 | 欧美激情第28页 | 在线观看 亚洲 | 久久婷亚洲五月一区天天躁 | 亚洲精品黄 | 国产成人黄色av | 欧美一级免费 | 免费91在线观看 | 亚洲精品www | 91成人在线看| 蜜臀一区二区三区精品免费视频 | 亚洲人av免费网站 | 97人人澡人人添人人爽超碰 | 欧美激情第十页 | 久久福利影视 | 午夜精品一区二区三区在线观看 | 中文字幕在线视频一区 | av超碰在线 | 国产精品久久久亚洲 | 欧美另类网站 | 久草在线高清视频 | 伊人亚洲综合网 | 91精品麻豆 | 久久99精品一区二区三区三区 | 午夜的福利 | 国产精品美女久久久久久 | 日韩a在线观看 | 99精品免费视频 | www.久久色 | 久久久久国产视频 | 精品国产视频在线 | 欧美精品久久久久久久亚洲调教 | 天堂av最新网址 | 一级淫片在线观看 | 日韩超碰 | 国产69精品久久app免费版 | 中文字幕你懂的 | 超级碰碰碰免费视频 | 国产女人18毛片水真多18精品 | 色婷婷88av视频一二三区 | 中文字幕a在线 | 欧美一区二区精品在线 | www.精选视频.com | 黄色片视频在线观看 | 亚洲精品国产精品国自产观看浪潮 | 日韩欧美精品在线 | 久久久久久免费网 | 日韩在线电影一区二区 | 在线免费视频 你懂得 | 91探花国产综合在线精品 | 99久久这里只有精品 | 一级黄色电影网站 | 日本视频高清 | 碰天天操天天 | 国产日韩精品一区二区 | 欧美一级特黄高清视频 | 久久97超碰 | 久久精品中文字幕 | 欧美色图亚洲图片 | 国产一级视屏 | 亚洲天天干 | 在线亚洲小视频 | 久久久www免费电影网 | 日本激情视频中文字幕 | 国产在线精品福利 | 国产美女精彩久久 | 国产亚洲日| 特级免费毛片 | 色香蕉在线视频 | 国产伦理一区二区 | 人人看看人人 | 国产精品男女啪啪 | 午夜婷婷网 | 8090yy亚洲精品久久 | 欧美日韩在线观看不卡 | 最近中文字幕mv免费高清在线 | 最新影院 | 亚洲精品理论 | 97在线影院 | 草久在线观看 | 国产成人亚洲在线电影 | 亚洲日本va午夜在线影院 | 黄色av一级片 | 2023亚洲精品国偷拍自产在线 | 日韩中文三级 | 久久精品这里都是精品 | 国产精品久久久久久久久久直播 | 日本特黄特色aaa大片免费 | 亚洲成人第一区 | 久久毛片高清国产 | 欧美日韩伦理在线 | 国产日韩欧美精品在线观看 | 波多野结衣视频一区二区三区 | 成年人在线免费看视频 | 亚洲欧美日韩国产精品一区午夜 | 中文字幕大全 | 一区二区电影在线观看 | 中文字幕黄网 | 欧美高清成人 | 日韩com | 九九精品无码 | 国产小视频在线 | 国产一区二区免费在线观看 | 91丨九色丨蝌蚪丨对白 | 国产精品久久久久久久久久东京 | 黄网站色欧美视频 | 黄色免费视频在线观看 | 国产一级高清 | 久久婷亚洲五月一区天天躁 | 免费在线91 | 丁香婷婷综合激情 | 97在线精品 | 五月在线 | 精品亚洲男同gayvideo网站 | 午夜视频在线观看一区二区三区 | 99热在线精品观看 | 国产视频在线播放 | 亚洲欧美日韩一区二区三区在线观看 | 热久久免费国产视频 | 91精品色 | 日韩免费一级电影 | 麻豆av一区二区三区在线观看 | 色网免费观看 | 国产码电影 | 99在线国产 | 日日麻批40分钟视频免费观看 | 日韩午夜视频在线观看 | 日韩免费一区二区 | www.69xx| 99精品视频在线 | 在线观看一区视频 | 在线黄色av电影 | 国产精品一区二区久久精品 | 国产精品男女啪啪 | 91成年人网站| 91麻豆网站 | 片网站| 九九视频免费观看视频精品 | 欧美最猛性xxxxx亚洲精品 | 日韩久久电影 | 美女免费网站 | 99久久久久久久久 | a午夜在线| 黄网站app在线观看免费视频 | 蜜桃视频成人在线观看 | 欧美最猛性xxxx| 97在线超碰 | 精品一区二区免费在线观看 | 国产黄在线看 | 精品一区久久 | 国产精品嫩草影院123 | 国产一级淫片免费看 | 日韩电影精品 | 欧美亚洲国产精品久久高清浪潮 | www日韩在线观看 | 毛片一区二区 | 精品国产伦一区二区三区观看体验 | 成人小视频在线 | 日批网站在线观看 | 国产一区二区在线播放视频 | 激情久久一区二区三区 | 99热在线这里只有精品 | av免费线看| 中文伊人 | 亚洲一区二区精品 | 久久精品久久久久久久 | 玖玖视频国产 | 久久99精品国产99久久 | 日韩中文字幕在线看 | 久久免费高清 | 激情av一区二区 | 久久精品96| 人人舔人人插 | 色欧美成人精品a∨在线观看 | 成人观看视频 | 欧美日韩久久不卡 | 久久婷婷色| 九九九视频精品 | 婷婷丁香自拍 | 日韩av中文字幕在线免费观看 | 国产日韩中文在线 | 久久人人爽爽人人爽人人片av | 日韩高清免费电影 | 欧美久久久久久久久久久久久 | 国产伦精品一区二区三区免费 | 国产不卡一区二区视频 | 日韩一级黄色片 | 国产免费久久精品 | 日韩av区| 久久免费公开视频 | 国产成人99久久亚洲综合精品 | 91av视频在线观看免费 | 在线观看日韩中文字幕 | 亚洲国产一区av | 在线一区观看 | 手机看片久久 | 奇米网777 | 亚洲精品在线二区 | 91传媒在线播放 | 国产精品国产三级国产aⅴ入口 | 婷婷丁香在线 | 久久免费视频4 | 久久视频免费观看 | av高清一区二区三区 | 日韩在线观看第一页 | 91精品国产乱码久久 | 在线视频福利 | 在线a亚洲视频播放在线观看 | 亚洲视频2 | 欧女人精69xxxxxx | 国产成人黄色 | www在线观看国产 | 久久免费精品视频 | 日本久久91 | 亚洲精品午夜久久久久久久久久久 | 麻豆传媒在线免费看 | 深爱婷婷激情 | 久久久蜜桃 | 日韩精品久久久久久中文字幕8 | 一本到在线 | 国产午夜不卡 | 99免费在线视频 | 日韩一区正在播放 | 中文字幕免费观看视频 | 色网站在线免费观看 | 国产亚洲亚洲 | caobi视频 | 色综合天天色 | 伊人影院av | 久久国产亚洲 | 国产成人av电影在线 | 婷婷av网 | 久久精品牌麻豆国产大山 | 久久av伊人 | 久久婷婷综合激情 | 国产精品美女久久久久aⅴ 干干夜夜 | 天天操夜夜干 | 亚洲天堂网在线观看视频 | 日韩精品一二三 | 久久免费a | 久久精品99国产精品亚洲最刺激 | 日本黄色免费电影网站 | 99精品国产99久久久久久97 | 国产黄色资源 | 国产码电影 | 狠狠操狠狠操 | 九月婷婷人人澡人人添人人爽 | 久在线观看视频 | 爱爱一区 | av高清不卡 | 天天躁天天狠天天透 | 黄色大全在线观看 | 天天操天天色天天射 | 在线观看av大片 | aaa毛片视频| 久久久久久久久久影视 | 日韩.com| 日日狠狠| 91精品国产综合久久福利不卡 | 国产一区影院 | 日韩成人精品一区二区三区 | 国产成人av电影 | 久久久久国产视频 | 中文字幕在线观看第二页 | 久久九九九九 | 久久你懂的 | 免费在线观看av不卡 | 菠萝菠萝在线精品视频 | 久久久久久久久国产 | 日韩特级毛片 | 天天做天天射 | 91精品啪在线观看国产线免费 | 福利一区在线视频 | 特级毛片爽www免费版 | 国产高清不卡在线 | 国产精品二区在线观看 | 99久久激情 | 中文在线www | 国产一级电影 | 久久精品99 | 精品99免费 | 亚洲综合精品视频 | 日韩理论片在线观看 | 日韩日韩日韩日韩 | 亚洲女人天堂成人av在线 | 又湿又紧又大又爽a视频国产 | 欧美在线观看视频一区二区三区 | 久久综合网色—综合色88 | 三级黄色大片在线观看 | 超碰.com| 天天天在线综合网 | 欧美另类色图 | 激情综合五月天 | 91在线视频免费观看 | 日韩黄色一级电影 | 免费色视频网址 |