青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Benjamin

靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠。
隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
數(shù)據(jù)加載中……

STL算法(Algorithms):修改操作(拷貝、替換等)

Stl的函數(shù)對象的寫操作:
copy、copy_backward、swap、swap_ranges、iter_swap、transform、
replace、replace_if、replace_copy、replace_copy_if、fill、fill_n、
generate、generate_n、remove、remove_if、remove_copy、remove_copy_if、
unique、unique_copy、reverse、reverse_copy、rotate、rotate_copy、
random_shuffle、partition、stable_partition
1. 拷貝:copy和copy_backward
Copy的原型:
template <class InputIterator, class OutputIterator>
  OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result );
copy_backward原型:
template <class BidirectionalIterator1, class BidirectionalIterator2>
  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
                                         BidirectionalIterator1 last,
                                         BidirectionalIterator2 result );
這兩個函數(shù)區(qū)別:copy是正常的拷貝,copy_backward則是從序列的末尾開始拷貝;
copy_backward和下面的代碼等效
template<class BidirectionalIterator1, class BidirectionalIterator2>
  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
                                         BidirectionalIterator1 last,
                                         BidirectionalIterator2 result )
{
  while (last!=first) *(--result) = *(--last);
  return result;
}
Copy和下面的代碼等效
template<class InputIterator, class OutputIterator>
  OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
{
  while (first!=last) *result++ = *first++;
  return result;
}
copy例子:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int myints[]={10,20,30,40,50,60,70};
  vector<int> myvector;
  vector<int>::iterator it;

  myvector.resize(7);   // allocate space for 7 elements

  copy ( myints, myints+7, myvector.begin() );

  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
copy_backward例子:
// copy_backward example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  vector<int> myvector;
  vector<int>::iterator it;

  // set some values:
  for (int i=1; i<=5; i++)
    myvector.push_back(i*10);          // myvector: 10 20 30 40 50

  myvector.resize(myvector.size()+3);  // allocate space for 3 more elements

  copy_backward ( myvector.begin(), myvector.begin()+5, myvector.end() );

  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
這個輸出的是myvector contains: 10 20 30 10 20 30 40 50

 

2、交換:swap、swap_ranges、iter_swap
Swap交換兩個對象的值;swap_ranges是交換連個范圍內(nèi)的值;
iter_swap通過迭代器交換兩個對象指針的值
例子:
// swap algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {

  int x=10, y=20;                         // x:10 y:20
  swap(x,y);                              // x:20 y:10

  vector<int> first (4,x), second (6,y);  // first:4x20 second:6x10
  swap(first,second);                     // first:6x10 second:4x20

  cout << "first contains:";
  for (vector<int>::iterator it=first.begin(); it!=first.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
// swap_ranges example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  vector<int> first (5,10);        //  first: 10 10 10 10 10
  vector<int> second (5,33);       // second: 33 33 33 33 33
  vector<int>::iterator it;

  swap_ranges(first.begin()+1, first.end()-1, second.begin());

  // print out results of swap:
  cout << " first contains:";
  for (it=first.begin(); it!=first.end(); ++it)
    cout << " " << *it;

  cout << "\nsecond contains:";
  for (it=second.begin(); it!=second.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
// iter_swap example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {

  int myints[]={10,20,30,40,50 };          //   myints:  10  20  30  40  50
  vector<int> myvector (4,99);             // myvector:  99  99  99  99

  iter_swap(myints,myvector.begin());      //   myints: [99] 20  30  40  50
                                           // myvector: [10] 99  99  99

  iter_swap(myints+3,myvector.begin()+2);  //   myints:  99  20  30 [99]
                                           // myvector:  10  99 [40] 99

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
3、替換: replace、replace_if、replace_copy、replace_copy_if
replace是簡單的值替換;replace_if是有條件的替換;
replace_copy是替換并重新輸出到另一個序列中;
replace_copy_if和上面的功能類似,不過有條件;
注意:這里如果有參數(shù)是類對象,則必須重載()
例子:// replace algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
  vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20

  replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}
// replace_if example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool IsOdd (int i) { return ((i%2)==1); }

int main () {
  vector<int> myvector;
  vector<int>::iterator it;

  // set some values:
  for (int i=1; i<10; i++) myvector.push_back(i);          // 1 2 3 4 5 6 7 8 9
 
  replace_if (myvector.begin(), myvector.end(), IsOdd, 0); // 0 2 0 4 0 6 0 8 0

  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}

// replace_copy example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };

  vector<int> myvector (8);
  replace_copy (myints, myints+8, myvector.begin(), 20, 99);

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}
// replace_copy_if example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool IsOdd (int i) { return ((i%2)==1); }

int main () {
  vector<int> first,second;
  vector<int>::iterator it;

  // set some values:
  for (int i=1; i<10; i++) first.push_back(i);          // 1 2 3 4 5 6 7 8 9

  second.resize(first.size());   // allocate space
  replace_copy_if (first.begin(), first.end(), second.begin(), IsOdd, 0);
                                                        // 0 2 0 4 0 6 0 8 0

  cout << "second contains:";
  for (it=second.begin(); it!=second.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}

4、初始化:fill、fill_n、generate、generate_n
fill和fill_n類似于memset;
generate和generate_n通過函數(shù)來產(chǎn)生每個值。
例子:
// fill algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0

  fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
  fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}
// fill_n example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  vector<int> myvector (8,10);        // myvector: 10 10 10 10 10 10 10 10

  fill_n (myvector.begin(),4,20);     // myvector: 20 20 20 20 10 10 10 10
  fill_n (myvector.begin()+3,3,33);   // myvector: 20 20 20 33 33 33 10 10

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}
// generate algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

// function generator:
int RandomNumber () { return (rand()%100); }

// class generator:
struct c_unique {
  int current;
  c_unique() {current=0;}
  int operator()() {return ++current;}
} UniqueNumber;


int main () {
  srand ( unsigned ( time(NULL) ) );

  vector<int> myvector (8);
  vector<int>::iterator it;

  generate (myvector.begin(), myvector.end(), RandomNumber);

  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  generate (myvector.begin(), myvector.end(), UniqueNumber);

  cout << "\nmyvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}
// generate_n example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int current(0);
int UniqueNumber () { return ++current; }

int main () {
  int myarray[9];

  generate_n (myarray, 9, UniqueNumber);

  cout << "myarray contains:";
  for (int i=0; i<9; ++i)
    cout << " " << myarray[i];

  cout << endl;
  return 0;
}
5、轉(zhuǎn)換:transform(適用于對某個序列內(nèi)的每個成員進行的某個操作)
原型:template < class InputIterator, class OutputIterator, class UnaryOperator >
  OutputIterator transform ( InputIterator first1, InputIterator last1,
                             OutputIterator result, UnaryOperator op );

template < class InputIterator1, class InputIterator2,
           class OutputIterator, class BinaryOperator >
  OutputIterator transform ( InputIterator1 first1, InputIterator1 last1,
                             InputIterator2 first2, OutputIterator result,
                             BinaryOperator binary_op );
例子:
// transform algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int op_increase (int i) { return ++i; }
int op_sum (int i, int j) { return i+j; }

int main () {
  vector<int> first;
  vector<int> second;
  vector<int>::iterator it;

  // set some values:
  for (int i=1; i<6; i++) first.push_back (i*10); //  first: 10 20 30 40 50

  second.resize(first.size());     // allocate space
  transform (first.begin(), first.end(), second.begin(), op_increase);
                                                  // second: 11 21 31 41 51

  transform (first.begin(), first.end(), second.begin(), first.begin(), op_sum);
                                                  //  first: 21 41 61 81 101

  cout << "first contains:";
  for (it=first.begin(); it!=first.end(); ++it)
    cout << " " << *it;

  cout << endl;
  return 0;
}
6、刪除:remove、remove_if、remove_copy、remove_copy_if、unique、unique_copy
remove:從序列中刪除某個元素
原型:template < class ForwardIterator, class T >
  ForwardIterator remove ( ForwardIterator first, ForwardIterator last,
                           const T& value );
remove_if:將符合條件的都刪除掉;remvoe和remove刪除后,序列的長度會有變化(減少)
原型:template < class ForwardIterator, class Predicate >
  ForwardIterator remove_if ( ForwardIterator first, ForwardIterator last,
                              Predicate pred );
remove_copy:將刪除后的序列拷貝到另外一個序列中
原型:template <class InputIterator, class OutputIterator, class T>
  OutputIterator remove_copy ( InputIterator first, InputIterator last,
                               OutputIterator result, const T& value );
remove_copy_if:基本功能和remove_copy類似,不過這里是有條件的刪除
原型:template <class InputIterator, class OutputIterator, class Predicate>
  OutputIterator remove_copy_if ( InputIterator first, InputIterator last,
                                  OutputIterator result, Predicate pred );
unique:刪除連續(xù)的重復(fù)的元素
原型:template <class ForwardIterator>
  ForwardIterator unique ( ForwardIterator first, ForwardIterator last );

template <class ForwardIterator, class BinaryPredicate>
  ForwardIterator unique ( ForwardIterator first, ForwardIterator last,
                           BinaryPredicate pred );
unique_copy:將刪除連續(xù)的重復(fù)的元素后的序列拷貝到另一個序列中
原型: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 );
示例:
// remove algorithm example
#include <iostream>
#include <algorithm>
using namespace std;

int main () {
  int myints[] = {10,20,30,30,20,10,10,20};      // 10 20 30 30 20 10 10 20

  // bounds of range:
  int* pbegin = myints;                          // ^
  int* pend = myints+sizeof(myints)/sizeof(int); // ^                       ^

  pend = remove (pbegin, pend, 20);              // 10 30 30 10 10 ?  ?  ?
                                                 // ^              ^
  cout << "range contains:";
  for (int* p=pbegin; p!=pend; ++p)
    cout << " " << *p;

  cout << endl;
 
  return 0;
}
// remove_if example
#include <iostream>
#include <algorithm>
using namespace std;

bool IsOdd (int i) { return ((i%2)==1); }

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 = remove_if (pbegin, pend, IsOdd);        // 2 4 6 8 ? ? ? ? ?
                                                 // ^       ^
  cout << "range contains:";
  for (int* p=pbegin; p!=pend; ++p)
    cout << " " << *p;

  cout << endl;
 
  return 0;
}
// remove_copy example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int myints[] = {10,20,30,30,20,10,10,20};          // 10 20 30 30 20 10 10 20
  vector<int> myvector (8);
  vector<int>::iterator it;

  remove_copy (myints,myints+8,myvector.begin(),20); // 10 30 30 10 10 0 0 0

  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}
// remove_copy_if example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool IsOdd (int i) { return ((i%2)==1); }

int main () {
  int myints[] = {1,2,3,4,5,6,7,8,9};         
  vector<int> myvector (9);
  vector<int>::iterator it;

  remove_copy_if (myints,myints+9,myvector.begin(),IsOdd);

  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}
// unique algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool 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 10
  vector<int> myvector (myints,myints+9);
  vector<int>::iterator it;

  // using default comparison:
  it = unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 ?  ?  ?  ?
                                                  //                ^

  myvector.resize( it - myvector.begin() );       // 10 20 30 20 10

  // using predicate comparison:
  unique (myvector.begin(), myvector.end(), myfunction);   // (no changes)

  // print out content:
  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
// unique_copy example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool myfunction (int i, int j) {
  return (i==j);
}

int main () {
  int myints[] = {10,20,20,20,30,30,20,20,10};
  vector<int> myvector (9);                            // 0  0  0  0  0  0  0  0  0
  vector<int>::iterator it;

  // using default comparison:
  it=unique_copy (myints,myints+9,myvector.begin());   // 10 20 30 20 10 0  0  0  0
                                                       //                ^

  sort (myvector.begin(),it);                          // 10 10 20 20 30 0  0  0  0
                                                       //                ^

  // using predicate comparison:
  it=unique_copy (myvector.begin(), it, myvector.begin(), myfunction);
                                                       // 10 20 30 20 30 0  0  0  0
                                                       //          ^

  myvector.resize( it - myvector.begin() );            // 10 20 30

  // print out content:
  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
7、更改序列內(nèi)元素的順序:reverse、reverse_copy、rotate、rotate_copy、random_shuffle、
reverse:反轉(zhuǎn)序列
原型:template <class BidirectionalIterator>
  void reverse ( BidirectionalIterator first, BidirectionalIterator last);
reverse_copy:將反轉(zhuǎn)后的序列拷貝
原型:<algorithm>
template <class BidirectionalIterator, class OutputIterator>
  OutputIterator reverse_copy ( BidirectionalIterator first,
                                BidirectionalIterator last, OutputIterator result );
rotate:旋轉(zhuǎn)元素(將指定范圍內(nèi)的元素移到尾部,其他的元素相對前移)
原型:template <class ForwardIterator>
  void rotate ( ForwardIterator first, ForwardIterator middle,
                ForwardIterator last );
rotate_copy:將元素旋轉(zhuǎn)后并拷貝
原型:template <class ForwardIterator, class OutputIterator>
  OutputIterator rotate_copy ( ForwardIterator first, ForwardIterator middle,
                               ForwardIterator last, OutputIterator result );
random_shuffle:重排序列內(nèi)的隨機元素
原型:template <class RandomAccessIterator>
  void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last );

template <class RandomAccessIterator, class RandomNumberGenerator>
  void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                        RandomNumberGenerator& rand );
示例:
// reverse algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  vector<int> myvector;
  vector<int>::iterator it;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  reverse(myvector.begin(),myvector.end());       // 9 8 7 6 5 4 3 2 1

  // print out content:
  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
// reverse_copy example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int myints[] ={1,2,3,4,5,6,7,8,9};
  vector<int> myvector;
  vector<int>::iterator it;

  myvector.resize(9);

  reverse_copy (myints, myints+9, myvector.begin());

  // print out content:
  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
// rotate algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  vector<int> myvector;
  vector<int>::iterator it;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  rotate(myvector.begin(),myvector.begin()+3,myvector.end());
                                                  // 4 5 6 7 8 9 1 2 3

  // print out content:
  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
// rotate_copy algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int myints[] = {10,20,30,40,50,60,70};

  vector<int> myvector;
  vector<int>::iterator it;

  myvector.resize(7);

  rotate_copy(myints,myints+3,myints+7,myvector.begin());

  // print out content:
  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
// random_shuffle example
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

// random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}

// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;

int main () {
  srand ( unsigned ( time (NULL) ) );
  vector<int> myvector;
  vector<int>::iterator it;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  // using built-in random generator:
  random_shuffle ( myvector.begin(), myvector.end() );

  // using myrandom:
  random_shuffle ( myvector.begin(), myvector.end(), p_myrandom);

  // print out content:
  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
8、分割序列:partition、stable_partition
partition:按照pred制定的規(guī)則對序列進行分割
原型:template <class BidirectionalIterator, class Predicate>
  BidirectionalIterator partition ( BidirectionalIterator first,
                                    BidirectionalIterator last, Predicate pred );
stable_partition:基本功能和上面的類似,不同的是分割后的序列都是排序過的(順序)
原型和partition的一樣。
示例:
// partition algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool IsOdd (int i) { return (i%2)==1; }

int main () {
  vector<int> myvector;
  vector<int>::iterator it, bound;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  bound = partition (myvector.begin(), myvector.end(), IsOdd);

  // print out content:
  cout << "odd members:";
  for (it=myvector.begin(); it!=bound; ++it)
    cout << " " << *it;

  cout << "\neven members:";
  for (it=bound; it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}
// stable_partition example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool IsOdd (int i) { return (i%2)==1; }

int main () {
  vector<int> myvector;
  vector<int>::iterator it, bound;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  bound = stable_partition (myvector.begin(), myvector.end(), IsOdd);

  // print out content:
  cout << "odd members:";
  for (it=myvector.begin(); it!=bound; ++it)
    cout << " " << *it;

  cout << "\neven members:";
  for (it=bound; it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}

 

 

 

 

 


 

posted on 2012-02-05 21:39 Benjamin 閱讀(1039) 評論(0)  編輯 收藏 引用 所屬分類: 泛型編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本色道久久88亚洲综合88| 亚洲高清网站| 午夜欧美精品| 久久久久国产成人精品亚洲午夜| 国产欧美一区二区视频| 久久激情视频| 亚洲人成在线观看一区二区| 在线综合亚洲| 国产日韩欧美综合| 欧美777四色影视在线| 99成人在线| 久久国产黑丝| 亚洲国产欧美日韩| 国产精品久久亚洲7777| 久久动漫亚洲| 亚洲精品女人| 新片速递亚洲合集欧美合集| 在线观看日韩www视频免费| 欧美精品不卡| 欧美在线国产| 亚洲毛片在线看| 久久久人成影片一区二区三区观看| 亚洲福利视频免费观看| 欧美视频一区二区在线观看| 久久久久国产精品厨房| 日韩天堂在线视频| 麻豆免费精品视频| 亚洲综合欧美日韩| 亚洲欧洲日韩女同| 国产日韩欧美视频在线| 欧美精品日本| 久久免费精品视频| 亚洲欧美久久久| 亚洲国产成人91精品 | 亚洲电影免费在线观看| 欧美日韩国产经典色站一区二区三区| 亚洲欧美日韩国产一区| 亚洲国产精品电影| 久久婷婷国产综合国色天香| 亚洲视频在线一区| 亚洲区一区二| 激情av一区| 国产欧美精品日韩| 欧美日韩一区自拍| 免费观看成人| 欧美在线看片| 亚洲欧美三级在线| 亚洲精品中文字幕女同| 欧美国产高清| 久久亚洲二区| 欧美在线视频a| 亚洲综合色噜噜狠狠| 亚洲精品国产精品国自产观看| 国户精品久久久久久久久久久不卡| 欧美午夜精品久久久久久孕妇| 免费不卡欧美自拍视频| 欧美一区二区三区在线| 亚洲一区二区三区视频播放| 日韩一级精品视频在线观看| 欧美电影免费| 免费视频一区| 久久综合色8888| 久久精品国产免费观看| 午夜精品在线看| 亚洲一级黄色片| 一区二区欧美日韩| 亚洲精品久久久久久久久久久久久| 红桃av永久久久| 精品99一区二区三区| 一区二区亚洲精品| 韩国av一区二区三区四区| 国产午夜精品在线观看| 国产一区视频网站| 国产亚洲激情在线| 国内精品免费在线观看| 国产专区欧美专区| 国内精品久久久久国产盗摄免费观看完整版 | 久久综合五月天婷婷伊人| 久久久国产一区二区| 久久躁狠狠躁夜夜爽| 美女视频黄 久久| 免费永久网站黄欧美| 免费观看30秒视频久久| 男人天堂欧美日韩| 欧美电影免费观看网站| 欧美日韩亚洲一区二区三区四区| 欧美色欧美亚洲另类七区| 国产精品网站在线播放| 国模私拍一区二区三区| 在线成人亚洲| 日韩午夜高潮| 亚洲欧美日韩在线观看a三区| 欧美亚洲免费| 美女日韩欧美| 亚洲人成网站在线观看播放| 一本久久综合亚洲鲁鲁| 亚洲欧美日韩在线一区| 久久午夜激情| 欧美连裤袜在线视频| 国产精品伦一区| 国产在线精品自拍| 狠久久av成人天堂| 夜夜嗨av色一区二区不卡| 亚洲欧美激情视频在线观看一区二区三区| 亚洲欧美另类国产| 久久精品在线| 亚洲国产一区二区三区在线播 | 宅男在线国产精品| 欧美一级久久久| 欧美激情综合| 国产精品私拍pans大尺度在线| 狠狠色丁香婷综合久久| 亚洲精品无人区| 欧美中文字幕不卡| 亚洲成色777777在线观看影院| 一区二区三区精品久久久| 欧美在线不卡视频| 欧美精品一区二区三区久久久竹菊 | 欧美福利在线| 亚洲视频在线观看三级| 久久婷婷av| 国产精品国产三级国产专播品爱网| 韩日午夜在线资源一区二区| 日韩视频亚洲视频| 久久人人九九| 一区二区三区四区五区视频 | 久久久.com| 妖精视频成人观看www| 久久精品国产96久久久香蕉| 欧美日韩一区二区欧美激情 | 这里只有精品视频在线| 麻豆精品精品国产自在97香蕉| 在线视频日本亚洲性| 免费久久精品视频| 国产综合精品一区| 亚洲性图久久| 亚洲国产精品一区二区www在线| 午夜精品理论片| 国产精品99免费看 | 日韩一区二区精品葵司在线| 久久精品国产91精品亚洲| 99国产精品99久久久久久粉嫩| 欧美在线一二三四区| 国产精品mm| 一区二区三区欧美日韩| 亚洲国产一区二区精品专区| 久久免费视频一区| 狠狠久久亚洲欧美专区| 久久激情视频免费观看| 亚洲免费中文| 国产精品九九| 中文国产亚洲喷潮| 亚洲精选中文字幕| 欧美精品情趣视频| 99精品免费视频| 亚洲黄色有码视频| 你懂的网址国产 欧美| 在线观看91久久久久久| 久久久人人人| 久久国内精品自在自线400部| 国产日韩精品久久久| 欧美一区二区三区视频在线| 亚洲伊人第一页| 国产精品一区免费观看| 欧美影院久久久| 亚洲欧美综合另类中字| 国产欧美日本在线| 久久久97精品| 欧美中文字幕在线播放| 一区二区视频在线观看| 蜜桃av噜噜一区| 欧美成人午夜激情在线| 亚洲美女av黄| 亚洲另类在线一区| 国产精品乱码人人做人人爱| 欧美一级大片在线免费观看| 亚洲欧美伊人| 国产一区二区在线观看免费| 欧美一区二视频| 久久久久久成人| 亚洲高清在线观看| 亚洲精品精选| 国产精品久久久久久久久久尿| 欧美一区二区三区四区在线观看| 欧美亚洲专区| 亚洲国产欧洲综合997久久| 91久久线看在观草草青青| 欧美性猛交视频| 久久久人人人| 欧美国产综合一区二区| 亚洲宅男天堂在线观看无病毒| 亚洲综合色视频| 亚洲二区在线观看| 亚洲毛片av在线| 国产亚洲欧美一区二区| 欧美 日韩 国产在线| 欧美日韩亚洲另类| 久久久久免费观看| 欧美另类在线观看| 久久精品国产2020观看福利|