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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

STL详解

發(fā)布時間:2024/3/13 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

STL就是Standard Template Library,標準模板庫。這可能是一個歷史上最令人興奮的工具的最無聊的術語。從根本上說,STL是一些“容器”的集合,這些“容器”有list, vector,set,map等,STL也是算法和其它一些組件的集合。這里的“容器”和算法的集合指的是世界上很多聰明人很多年的杰作。是C++標準庫的一個重要組成部分,它由Stepanov and Lee等人最先開發(fā),它是與C++幾乎同時開始開發(fā)的;一開始STL選擇了Ada作為實現(xiàn)語言,但Ada有點不爭氣,最后他們選擇了C++,C++中已經(jīng)有了模板。STL又被添加進了C++庫。1996年,惠普公司又免費公開了STL,為STL的推廣做了很大的貢獻。STL提供了類型安全、高效而易用特性的STL無疑是最值得C++程序員驕傲的部分。每一個C++程序員都應該好好學習STL。大體上包括container(容器)、algorithm(算法)和iterator(迭代器),容器和算法通過迭代器可以進行無縫連接。

?

一、基礎知識

1、泛型技術

泛型技術的實現(xiàn)方法有多種,比如模板,多態(tài)等。模板是編譯時決定,多態(tài)是運行時決定,其他的比如RTTI也是運行時確定。多態(tài)是依靠虛表在運行時查表實現(xiàn)的。比如一個類擁有虛方法,那么這個類的實例的內(nèi)存起始地址就是虛表地址,可以把內(nèi)存起始地址強制轉換成int*,取得虛表,然后(int*)*(int*)取得虛表里的第一個函數(shù)的內(nèi)存地址,然后強制轉換成函數(shù)類型,即可調(diào)用來驗證虛表機制。

泛型編程(generic programming,以下直接以GP稱呼)是一種全新的程序設計思想,和OO,OB,PO這些為人所熟知的程序設計想法不同的是GP抽象度更高,基于GP設計的組件之間偶合度底,沒有繼承關系,所以其組件間的互交性和擴展性都非常高。我們都知道,任何算法都是作用在一種特定的數(shù)據(jù)結構上的,最簡單的例子就是快速排序算法最根本的實現(xiàn)條件就是所排序的對象是存貯在數(shù)組里面,因為快速排序就是因為要用到數(shù)組的隨機存儲特性,即可以在單位時間內(nèi)交換遠距離的對象,而不只是相臨的兩個對象,而如果用聯(lián)表去存儲對象,由于在聯(lián)表中取得對象的時間是線性的即O[n],這樣將使快速排序失去其快速的特點。也就是說,我們在設計一種算法的時候,我們總是先要考慮其應用的數(shù)據(jù)結構,比如數(shù)組查找,聯(lián)表查找,樹查找,圖查找其核心都是查找,但因為作用的數(shù)據(jù)結構不同將有多種不同的表現(xiàn)形式。數(shù)據(jù)結構和算法之間這樣密切的關系一直是我們以前的認識。泛型設計的根本思想就是想把算法和其作用的數(shù)據(jù)結構分離,也就是說,我們設計算法的時候并不去考慮我們設計的算法將作用于何種數(shù)據(jù)結構之上。泛型設計的理想狀態(tài)是一個查找算法將可以作用于數(shù)組,聯(lián)表,樹,圖等各種數(shù)據(jù)結構之上,變成一個通用的,泛型的算法。

2、四種類型轉換操作符

static_cast?????將一個值以符合邏輯的方式轉換。應用到類的指針上,意思是說它允許子類類型的指針轉換為父類類型的指針(這是一個有效的隱式轉換),同時,也能夠執(zhí)行相反動作:轉換父類為它的子類。

例如:float x;

??????Count<<static_cast<int>(x);//把x作為整型值輸出

?

dynamic_cast??????????????將多態(tài)類型向下轉換為其實際靜態(tài)類型。只用于對象的指針和引用。當用于多態(tài)類型時,它允許任意的隱式類型轉換以及相反過程。dynamic_cast會檢查操作是否有效。也就是說,它會檢查轉換是否會返回一個被請求的有效的完整對象。檢測在運行時進行。如果被轉換的指針不是一個被請求的有效完整的對象指針,返回值為NULL.??????

例如:class Car;

?????????class Cabriolet:public Car{

?????????…

};

?????????class Limousline:public Car{

?????????…

};

?????????void f(Car *cp)

?????????{

??????????????Cabriolet *p = dynamic_cast< Cabriolet > cp;

}

?

reinterpret_cast???轉換一個指針為其它類型的指針。它也允許從一個指針轉換為整數(shù)類型。反之亦然。這個操作符能夠在非相關的類型之間轉換。操作結果只是簡單的從一個指針到別的指針的值的二進制拷貝。在類型之間指向的內(nèi)容不做任何類型的檢查和轉換。

例如:

class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);

?

const_cast一般用于強制消除對象的常量性。

例如:

class C {};
const C *a = new C;
C *b = const_cast<C *>(a);
其它三種操作符是不能修改一個對象的常量性的。

?

3、explicit修飾的構造函數(shù)不能擔任轉換函數(shù)。在很多情況下,隱式轉換是有意的,并且是正當?shù)摹5袝r我們不希望進行這種自動的轉換。

例如:為了避免這樣的隱式轉換,應該象下面這樣顯式聲明該帶單一參數(shù)的構造函數(shù):

class String {
int size;
char *p;
//..
public:
?????? //?不要隱式轉換
?????? explicit String (int sz);?
?????? String (const char *s, int size n = 0); //?隱式轉換
};
void f ()
{
????String s(10);
????s = 100; //?現(xiàn)在編譯時出錯;需要顯式轉換:
????s = String(100); //?好;顯式轉換
????s = "st";????????//?好;此時允許隱式轉換
}

?

4、命名空間namespace

???解決在使用不同模塊和程序庫時,出現(xiàn)名稱沖突問題。

5、C++標準程序庫中的通用工具。由類和函數(shù)構成。這些工具包括:

???數(shù)種通用類型

???一些重要的C函數(shù)

???數(shù)值極值

?

二、STL六大組件

容器(Container)

算法(Algorithm)

迭代器(Iterator)

仿函數(shù)(Function object)

適配器(Adaptor)

空間配置器(allocator)

1、容器

作為STL的最主要組成部分--容器,分為向量(vector),雙端隊列(deque),表(list),隊列(queue),堆棧(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。

容器

特性

所在頭文件

向量vector

可以用常數(shù)時間訪問和修改任意元素,在序列尾部進行插入和刪除時,具有常數(shù)時間復雜度,對任意項的插入和刪除就有的時間復雜度與到末尾的距離成正比,尤其對向量頭的添加和刪除的代價是驚人的高的

<vector>

雙端隊列deque

基本上與向量相同,唯一的不同是,其在序列頭部插入和刪除操作也具有常量時間復雜度

<deque>

表list

對任意元素的訪問與對兩端的距離成正比,但對某個位置上插入和刪除一個項的花費為常數(shù)時間。

<list>

隊列queue

插入只可以在尾部進行,刪除、檢索和修改只允許從頭部進行。按照先進先出的原則。

<queue>

堆棧stack

堆棧是項的有限序列,并滿足序列中被刪除、檢索和修改的項只能是最近插入序列的項。即按照后進先出的原則

<stack>

集合set

由節(jié)點組成的紅黑樹,每個節(jié)點都包含著一個元素,節(jié)點之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序,具有快速查找的功能。但是它是以犧牲插入刪除操作的效率為代價的

<set>

多重集合multiset

和集合基本相同,但可以支持重復元素具有快速查找能力

<set>

映射map

由{鍵,值}對組成的集合,以某種作用于鍵對上的謂詞排列。具有快速查找能力

<map>

多重集合multimap

比起映射,一個鍵可以對應多了值。具有快速查找能力

<map>

STL容器能力表:

?

?

2、算法

算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。< algorithm>是所有STL頭文件中最大的一個,它是由一大堆模版函數(shù)組成的,可以認為每個函數(shù)在很大程度上都是獨立的,其中常用到的功能范 圍涉及到比較、交換、查找、遍歷操作、復制、修改、移除、反轉、排序、合并等等。<numeric>體積很小,只包括幾個在序列上面進行簡單數(shù)學運算的模板函數(shù),包括加法和乘法在序列上的一些操作。<functional>中則定義了一些模板類,用以聲明函數(shù)對象。

STL的算法也是非常優(yōu)秀的,它們大部分都是類屬的,基本上都用到了C++的模板來實現(xiàn),這樣,很多相似的函數(shù)就不用自己寫了,只要用函數(shù)模板就可以了。

我們使用算法的時候,要針對不同的容器,比如:對集合的查找,最好不要用通用函數(shù)find(),它對集合使用的時候,性能非常的差,最好用集合自帶的find()函數(shù),它針對了集合進行了優(yōu)化,性能非常的高。

?

3、迭代器

它的具體實現(xiàn)在<itertator>中,我們完全可以不管迭代器類是怎么實現(xiàn)的,大多數(shù)的時候,把它理解為指針是沒有問題的(指針是迭代器的一個特例,它也屬于迭代器),但是,決不能完全這么做。

迭代器功能

輸入迭代器

Input iterator

向前讀

Reads forward

istream

輸出迭代器

Output iterator

向前寫

Writes forward

ostream,inserter

前向迭代器

Forward iterator

向前讀寫

Read and Writes forward

?

雙向迭代器

Bidirectional iterator

向前向后讀寫

Read and Writes forward and

backward

list,set,multiset,map,mul

timap

隨機迭代器

Random access iterator

隨機讀寫

Read and Write with random

access

vector,deque,array,string

?

4、仿函數(shù)

仿函數(shù),又或叫做函數(shù)對象,是STL六大組件之一;仿函數(shù)雖然小,但卻極大的拓展了算法的功能,幾乎所有的算法都有仿函數(shù)版本。例如,查找算法find_if就是對find算法的擴展,標準的查找是兩個元素相等就找到了,但是什么是相等在不同情況下卻需要不同的定義,如地址相等,地址和郵編都相等,雖然這些相等的定義在變,但算法本身卻不需要改變,這都多虧了仿函數(shù)。仿函數(shù)(functor)又稱之為函數(shù)對象(function object),其實就是重載了()操作符的struct,沒有什么特別的地方。

如以下代碼定義了一個二元判斷式functor:

struct IntLess
{
bool operator()(int left, int right) const
{
?? return (left < right);
};
};

為什么要使用仿函數(shù)呢?

1).仿函數(shù)比一般的函數(shù)靈活。

2).仿函數(shù)有類型識別,可以作為模板參數(shù)。

3).執(zhí)行速度上仿函數(shù)比函數(shù)和指針要更快的。

怎么使用仿函數(shù)?

除了在STL里,別的地方你很少會看到仿函數(shù)的身影。而在STL里仿函數(shù)最常用的就是作為函數(shù)的參數(shù),或者模板的參數(shù)。

在STL里有自己預定義的仿函數(shù),比如所有的運算符,=,-,*,、比如'<'號的仿函數(shù)是less

template<class _Ty>
struct less?? : public binary_function<_Ty, _Ty, bool>
{ // functor for operator<
??????? bool operator()(const _Ty& _Left, const _Ty& _Right) const
?????????????????? { // apply operator< to operands
????????????????????????????? return (_Left < _Right);
?????????????????? }
};

從上面的定義可以看出,less從binary_function<...>繼承來的,那么binary_function又是什么的?

template<class _Arg1, class _Arg2, class _Result>
struct?binary_function
{ // base class for binary functions
??????? typedef _Arg1 first_argument_type;
???? ?? typedef _Arg2 second_argument_type;
????? typedef _Result result_type;

};

其實binary_function只是做一些類型聲明而已,別的什么也沒做,但是在STL里為什么要做這些呢?如果你要閱讀過STL的源碼,你就會發(fā)現(xiàn),這樣的用法很多,其實沒有別的目的,就是為了方便,安全,可復用性等。但是既然STL里面內(nèi)定如此了,所以作為程序員你必須要遵循這個規(guī)則,否則就別想安全的使用STL。

比如我們自己定一個仿函數(shù)。可以這樣:

template <typename type1,typename type2>
class func_equal :public binary_function<type1,type2,bool>
{
??????? inline bool operator()(type1 t1,type2 t2) const//這里的const不能少
??????????? {
???????????????? return t1 == t2;//當然這里要overload==

????????? ?? }
}

我們看這一行:?inline bool operator()(type1 t1,type2 t2) const//這里的const不能少
inline是聲明為內(nèi)聯(lián)函數(shù),我想這里應該不用多說什么什么了,關鍵是為什么要聲明為const的?要想找到原因還是看源碼,加入如果我們這里寫一行代碼,find_if(s.begin(),s.end(),bind2nd(func_equal(),temp)),在bind2nd函數(shù)里面的參數(shù)是const類型的,const類型的對象,只能訪問cosnt修飾的函數(shù)!

與binary_function(二元函數(shù))相對的是unary_function(一元函數(shù)),其用法同binary_function

struct unary_function {?
typedef _A argument_type;?
typedef _R result_type;?
};

注:仿函數(shù)就是重載()的class,并且重載函數(shù)要為const的,如果要自定義仿函數(shù),并且用于STL接配器,那么一定要從binary_function或者,unary_function繼承。

?

5適配器

適配器是用來修改其他組件接口的STL組件,是帶有一個參數(shù)的類模板(這個參數(shù)是操作的值的數(shù)據(jù)類型)。STL定義了3種形式的適配器:容器適配器,迭代器適配器,函數(shù)適配器。

容器適配器:包括棧(stack)、隊列(queue)、優(yōu)先(priority_queue)。使用容器適配器,stack就可以被實現(xiàn)為基本容器類型(vector,dequeue,list)的適配。可以把stack看作是某種特殊的vctor,deque或者list容器,只是其操作仍然受到stack本身屬性的限制。queuepriority_queue與之類似。容器適配器的接口更為簡單,只是受限比一般容器要多。

迭代器適配器:修改為某些基本容器定義的迭代器的接口的一種STL組件。反向迭代器和插入迭代器都屬于迭代器適配器,迭代器適配器擴展了迭代器的功能。

函數(shù)適配器:通過轉換或者修改其他函數(shù)對象使其功能得到擴展。這一類適配器有否定器(相當于""操作)、綁定器、函數(shù)指針適配器。函數(shù)對象適配器的作用就是使函數(shù)轉化為函數(shù)對象,或是將多參數(shù)的函數(shù)對象轉化為少參數(shù)的函數(shù)對象。

例如:

在STL程序里,有的算法需要一個一元函數(shù)作參數(shù),就可以用一個適配器把一個二元函數(shù)和一個數(shù)值,綁在一起作為一個一元函數(shù)傳給算法。?
例如:?
find_if(coll.begin(), coll.end(), bind2nd(greater <int>(), 42));?
這句話就是找coll中第一個大于42的元素。?
greater <int>(),其實就是">"號,是一個2元函數(shù)?
bind2nd的兩個參數(shù),要求一個是2元函數(shù),一個是數(shù)值,結果是一個1元函數(shù)。
bind2nd就是個函數(shù)適配器。

?

6空間配置器

STL的內(nèi)存配置器在我們的實際應用中幾乎不用涉及,但它卻在STL的各種容器背后默默做了大量的工作,STL內(nèi)存配置器為容器分配并管理內(nèi)存。統(tǒng)一的內(nèi)存管理使得STL庫的可用性、可移植行、以及效率都有了很大的提升。

SGI-STL的空間配置器有2種,一種僅僅對c語言的malloc和free進行了簡單的封裝,而另一個設計到小塊內(nèi)存的管理等,運用了內(nèi)存池技術等。在SGI-STL中默認的空間配置器是第二級的配置器。

SGI使用時std::alloc作為默認的配置器。

A).alloc把內(nèi)存配置和對象構造的操作分開,分別由alloc::allocate()::construct()負責,同樣內(nèi)存釋放和對象析夠操作也被分開分別由alloc::deallocate()和::destroy()負責。這樣可以保證高效,因為對于內(nèi)存分配釋放和構造析夠可以根據(jù)具體類型(type traits)進行優(yōu)化。比如一些類型可以直接使用高效的memset來初始化或者忽略一些析構函數(shù)。對于內(nèi)存分配alloc也提供了2級分配器來應對不同情況的內(nèi)存分配。

B).第一級配置器直接使用malloc()和free()來分配和釋放內(nèi)存。第二級視情況采用不同的策略:當需求內(nèi)存超過128bytes的時候,視為足夠大,便調(diào)用第一級配置器;當需求內(nèi)存小于等于128bytes的時候便采用比較復雜的memeory pool的方式管理內(nèi)存。

C).無論allocal被定義為第一級配置器還是第二級,SGI還為它包裝一個接口,使得配置的接口能夠符合標準即把配置單位從bytes轉到了元素的大小:

???????? ?????????template<class?T,?class?Alloc>

class?simple_alloc

{

public:

?????static?T*?allocate(size_t?n)

???? {

?????????return?0 ==?n?? 0 : (T*)Alloc::allocate(n?*?sizeof(T));

???? }

?

?????static?T*?allocate(void)

???? {

?????????return?(T*)?Alloc::allocate(sizeof(T));

???? }

?

?????static?void?deallocate(T*?p,?size_t?n)

???? {

?????????if?(0 !=?n)?Alloc::deallocate(p,?n?*?sizeof(T));

???? }

?

?????static?void?deallocate(T*?p)

???? {

?????????Alloc::deallocate(p,?sizeof(T));

???? }

}???

?

d).內(nèi)存的基本處理工具,它們均具有commt or rollback能力。

template<class?InputIterator,?class?ForwardIterator>

ForwardIterator

uninitialized_copy(InputIterator?first,?InputIterator?last,?ForwardIterator?result);

?

template<class?ForwardIterator,?class?T>

void?uninitialized_fill(ForwardIterator?first,?ForwardIterator?last,?const?T&?x);

?

template<class?ForwardIterator,?class?Size,?class?T>

ForwardIterator

uninitialized_fill_n(ForwardIterator?first,?ForwardIterator?last,?const?T&?x)

?

三、具體容器、算法

1、所有容器都提供了一個默認的構造函數(shù),一個拷貝構造函數(shù)。

例如:

list<int> l;

....

vector<int> ivector(l.begin(),l.end());

?

int array[]={1,2,3,4};

....

set<int> iset(array,array+sizeof(array)/sizeof(array[0]));

?

2、與大小相關的函數(shù)

size(),empty(),max_size()

3、返回迭代器的函數(shù)

begin(),end(),rbegin(),rend()

4、比較操作

==,!=,<,>,>=....

?

Vector詳解:

capacity(),返回vector能夠容納的元素個數(shù)。

size(),返回vector內(nèi)現(xiàn)有元素的個數(shù)。

賦值操作:

c1=c2; 把c2的全部元素指派給c1

c.assign(n,elem);復制n個elem,指派給c

c.assign(beg,end);將區(qū)間beg,end內(nèi)的元素指派給c

c1.swap(c2);將c1,c2元素互換

swap(c1,c2);同上

元素存取

c.at(index);

c[index];

c.front();返回第一個元素

c.back();

?

插入和刪除:

c.insert(pos.elem);

c.insert(pos,n.elem); 插入n個elem

c.insert(pos,beg,end); 在pos出插入beg,end區(qū)間內(nèi)的所有元素。

c.push_back(elem);

c.pop_back();

c.erase(pos); 刪除pos上的元素,返回下一個元素

c.erase(beg,end);

c.resize(num);將元素數(shù)量改為num,如果size變大了,多出來的新元素都要一default方式構建。

c.resize(num,elem);將元素數(shù)量改為num,如果size變大了,多出來的新元素是elem的副本。

c.clear();刪除所有。

?

vector的reserve和resize

reserve只分配空間,而不創(chuàng)建對象,size()不變。而resize分配空間而且用空對象填充.

reserve是容器預留空間,但并不真正創(chuàng)建元素對象,在創(chuàng)建對象之前,不能引用容器內(nèi)的元素,因此當加入新的元素時,需要用push_back()/insert()函數(shù)。

resize是改變?nèi)萜鞯拇笮?#xff0c;并且創(chuàng)建對象,因此,調(diào)用這個函數(shù)之后,就可以引用容器內(nèi)的對象了,因此當加入新的元素時,用operator[]操作符,或者用迭代器來引用元素對象。

再者,兩個函數(shù)的形式是有區(qū)別的,reserve函數(shù)之后一個參數(shù),即需要預留的容器的空間;resize函數(shù)可以有兩個參數(shù),第一個參數(shù)是容器新的大小,第二個參數(shù)是要加入容器中的新元素,如果這個參數(shù)被省略,那么就調(diào)用元素對象的默認構造函數(shù)。

vector有而deque無的:capacity(), reserve();

deque有而vector無的:push_front(elem), pop_front(); push_back(elem), pop_back();

STL提供的另兩種容器queue、stack,其實都只不過是一種adaptor,它們簡單地修飾deque的界面而成為另外的容器類型

?

List詳解:

for_each??(.begin(), .end(), “函數(shù)”);

count (.begin(), .end(), 100, jishuqi);

返回對象等于100的個數(shù)jishuqi值。

count_if() 帶一個函數(shù)對象的參數(shù)(上面“100”的這個參數(shù))。函數(shù)對象是一個至少帶有一個operator()方法的類。這個類可以更復雜。

find(*.begin().*end(),“要找的東西”);

如果沒有找到指出的對象,就會返回*.end()的值,要是找到了就返回一個指著找到的對象的iterator

fine_if();與count_if()類似,是find的更強大版本。

STL通用算法search()用來搜索一個容器,但是是搜索一個元素串,不象find()和find_if() 只搜索單個的元素。

search算法在一個序列中找另一個序列的第一次出現(xiàn)的位置。

search(A.begin(), A.end(), B.begin(), B.end());

在A中找B這個序列的第一次出現(xiàn)。

要排序一個list,我們要用list的成員函數(shù)sort(),而不是通用算法sort()。

list容器有它自己的sort算法,這是因為通用算法僅能為那些提供隨機存取里面元素 的容器排序。

list的成員函數(shù)push_front()和push_back()分別把元素加入到list的前面和后面。你可以使用insert() 把對象插入到list中的任何地方。

insert()可以加入一個對象,一個對象的若干份拷貝,或者一個范圍以內(nèi)的對象。

list成員函數(shù)pop_front()刪掉list中的第一個元素,pop_back()刪掉最后一個元素。函數(shù)erase()刪掉由一個iterator指出的元素。還有另一個erase()函數(shù)可以刪掉一個范圍的元素。

list的成員函數(shù)remove()用來從list中刪除元素。

*.remove("要刪除的對象");

通用算法remove()使用和list的成員函數(shù)不同的方式工作。一般情況下不改變?nèi)萜鞯拇笮 ?/p>

remove(*.begin(),*.end(),"要刪除的對象");

使用STL通用算法stable_partition()和list成員函數(shù)splice()來劃分一個list。

stable_partition()是一個有趣的函數(shù)。它重新排列元素,使得滿足指定條件的元素排在不滿足條件的元素前面。它維持著兩組元素的順序關系。

splice 把另一個list中的元素結合到一個list中。它從源list中刪除元素。

?

Set Map詳解:

STL map和set的使用雖不復雜,但也有一些不易理解的地方,如:

為何map和set的插入刪除效率比用其他序列容器高?

為何每次insert之后,以前保存的iterator不會失效?

為何map和set不能像vector一樣有個reserve函數(shù)來預分配數(shù)據(jù)?

當數(shù)據(jù)元素增多時(10000到20000個比較),map和set的插入和搜索速度變化如何?

C++ STL中標準關聯(lián)容器set, multiset, map, multimap內(nèi)部采用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成為RB樹(Red-Black Tree)。RB樹的統(tǒng)計性能要好于一般的平衡二叉樹(AVL-樹).

為何map和set的插入刪除效率比用其他序列容器高?

大部分人說,很簡單,因為對于關聯(lián)容器來說,不需要做內(nèi)存拷貝和內(nèi)存移動。說對了,確實如此。map和set容器內(nèi)所有元素都是以節(jié)點的方式來存儲,其節(jié)點結構和鏈表差不多,指向父節(jié)點和子節(jié)點。這里的一切操作就是指針換來換去,和內(nèi)存移動沒有關系。

為何每次insert之后,以前保存的iterator不會失效?(同解)

為何map和set不能像vector一樣有個reserve函數(shù)來預分配數(shù)據(jù)?

究其原理來說時,引起它的原因在于在map和set內(nèi)部存儲的已經(jīng)不是元素本身了,而是包含元素的節(jié)點。

其實你就記住一點,在map和set內(nèi)面的分配器已經(jīng)發(fā)生了變化,reserve方法你就不要奢望了。

當數(shù)據(jù)元素增多時(10000和20000個比較),map和set的插入和搜索速度變化如何?

如果你知道log2的關系你應該就徹底了解這個答案。在map和set中查找是使用二分查找,也就是說,如果有16個元素,最多需要比較4次就能找到結果,有32個元素,最多比較5次。那么有10000個呢?最多比較的次數(shù)為log10000,最多為14次,如果是20000個元素呢?最多不過15次。

?

泛型算法:

所有算法的前兩個參數(shù)都是一對iterators:[first,last),用來指出容器內(nèi)一個范圍內(nèi)的元素。

每個算法的聲明中,都表現(xiàn)出它所需要的最低層次的iterator類型。

?

常用算法:

accumulate() 元素累加

adjacent_difference() 相鄰元素的差額

adjacent_find() 搜尋相鄰的重復元素

binary_search() 二元搜尋

copy() 復制

copy_backward() 逆向復制

count() 計數(shù)

count_if() 在特定條件下計數(shù)

equal() 判斷相等與否

equal_range() 判斷相等與否(傳回一個上下限區(qū)間范圍)

fill() 改填元素值

fill_n() 改填元素值,n 次

find() 搜尋

find_if() 在特定條件下搜尋

find_end() 搜尋某個子序列的最后一次出現(xiàn)地點

find_first_of() 搜尋某些元素的首次出現(xiàn)地點

for_each() 對范圍內(nèi)的每一個元素施行某動作

generate() 以指定動作的運算結果充填特定范圍內(nèi)的元素

generate_n() 以指定動作的運算結果充填 n 個元素內(nèi)容

includes() 涵蓋於

inner_product() 內(nèi)積

inplace_merge() 合并并取代(覆寫)

iter_swap() 元素互換

lexicographical_compare() 以字典排列方式做比較

lower_bound() 下限

max() 最大值

max_element() 最大值所在位置

min() 最小值

min_element() 最小值所在位置

merge() 合并兩個序列

mismatch() 找出不吻合點

next_permutation() 獲得下一個排列組合

泛型演算法(Generic Algorithms)與 Function Obje4 cts

nth_element() 重新安排序列中第n個元素的左右兩端

partial_sort() 局部排序

partial_sort_copy() 局部排序并復制到它處

partial_sum() 局部總和

partition() 切割

prev_permutation() 獲得前一個排列組合

random_shuffle() 隨機重排

remove() 移除某種元素(但不刪除)

remove_copy() 移除某種元素并將結果復制到另一個 container

remove_if() 有條件地移除某種元素

remove_copy_if() 有條件地移除某種元素并將結果復制到另一個 container

replace() 取代某種元素

replace_copy() 取代某種元素,并將結果復制到另一個 container

replace_if() 有條件地取代

replace_copy_if() 有條件地取代,并將結果復制到另一個 container

reverse() 顛倒元素次序

reverse_copy() 顛倒元素次序并將結果復制到另一個 container

rotate() 旋轉

rotate_copy() 旋轉,并將結果復制到另一個 container

search() 搜尋某個子序列

search_n() 搜尋「連續(xù)發(fā)生 n 次」的子序列

set_difference() 差集

set_intersection() 交集

set_symmetric_difference() 對稱差集

set_union() 聯(lián)集

sort() 排序

stable_partition() 切割并保持元素相對次序

stable_sort() 排序并保持等值元素的相對次序

swap() 置換(對調(diào))

swap_range() 置換(指定范圍)

transform() 以兩個序列為基礎,交互作用產(chǎn)生第三個序列

unique() 將重復的元素摺疊縮編,使成唯一

unique_copy() 將重復的元素摺疊縮編,使成唯一,并復制到他處

upper_bound() 上限

?

?

四、注意細節(jié):

1、auto_ptr?不能用new[]所生成的array作為初值,因為釋放內(nèi)存時用的是delete,而不是delete[]

2、就搜尋速度而言,hash table通常比二叉樹還要快5~10倍。hash table不是C++標準程序庫的一員。

3、迭代器使用過程中優(yōu)先選用前置式遞增操作符(++iter)而不是選擇后置式遞增操作符(iter++)。

3、迭代器三個輔助函數(shù):advance(),distance(),iter_swap()。

???????advance()可令迭代器前進

???????distance()可處理迭代器之間的距離。

???????iter_swap()可交換兩個迭代器所指內(nèi)容。

4、hasp函數(shù)?makeheap()、push_heap()、pop_heap()、sort_heap()

5、’/0’在string之中并不具有特殊意義,但是在一般C形式的string中卻用來標記字符串結束。在string中,字符?‘/0’和其他字符的地位完全相同。string中有三個函數(shù)可以將字符串內(nèi)容轉換成字符數(shù)組或C形式的string。

data()?????以字符數(shù)組的形式返回字符串內(nèi)容。但末未追加’/0’字符,返回類型并非有效的C形式string。

c_str()????以C形式返回字符串內(nèi)容(在末尾端添加’/0’字符)。

copy()????將字符串內(nèi)容復制到“調(diào)用者提供的字符數(shù)組”中,不添加’/0’字符。

6容器中用empty來代替檢查size是否為0;當使用new得到指針的容器時,切記在容器銷毀前delete那些指針;千萬不要把auto_ptr放入容器中。

7、盡量使用vectorstring來代替動態(tài)申請的數(shù)組;避免使用vector<bool>vector<bool>有兩個問題.第一,它不是一個真正STL容器,第二,它并不保存bool類型。

8、迭代器使用過程中,盡量使用iterator代替const_iteratorreverse_iteratorconst_reverse_iterator;使用distanceadvanceconst_iterators轉化成iterators

typedef deque<int> IntDeque;??// 和以前一樣

typedef IntDeque::iterator Iter;

typedef IntDeque::const_iterator ConstIter;

IntDeque??d;

ConstIter ci;

...?????// 讓ci指向d

Iter i(d.begin());????// 初始化i為d.begin()

advance(i, distance(i, ci));??// 調(diào)整i,指向ci位置

9、避免對setmultiset的鍵值進行修改。

10永遠讓比較函數(shù)對相同元素返回false。

11、排序選擇:

1)如果你需要在vector、string、deque或數(shù)組上進行完全排序,你可以使用sort或stable_sort。

2)如果你有一個vector、string、deque或數(shù)組,你只需要排序前n個元素,應該用partial_sort。

3)如果你有一個vector、string、deque或數(shù)組,你需要鑒別出第n個元素或你需要鑒別出最前的n個元素,而不用知道它們的順序,nth_element是你應該注意和調(diào)用的。

4)如果你需要把標準序列容器的元素或數(shù)組分隔為滿足和不滿足某個標準,你大概就要找partition或stable_partition。

5)如果你的數(shù)據(jù)是在list中,你可以直接使用partition和stable_partition,你可以使用list的sort來代替sort和stable_sort。如果你需要partial_sort或nth_element提供的效果,你就必須間接完成這個任務。
12、如果你真的想刪除東西的話就在類似remove的算法后接上erase。remove從一個容器中remove元素不會改變?nèi)萜髦性氐膫€數(shù),erase是真正刪除東西。
13、提防在指針的容器上使用類似remove的算法,在調(diào)用類似remove的算法前手動刪除和廢棄指針。
14、盡量用成員函數(shù)代替同名的算法,有些容器擁有和STL算法同名的成員函數(shù)。關聯(lián)容器提供了countfindlower_boundupper_boundequal_range,而list提供了removeremove_ifuniquesortmergereverse。大多數(shù)情況下,你應該用成員函數(shù)代替算法。這樣做有兩個理由。首先,成員函數(shù)更快。其次,比起算法來,它們與容器結合得更好(尤其是關聯(lián)容器)。那是因為同名的算法和成員函數(shù)通常并不是是一樣的。
15
、容器中使用自定義的結構體時,如果用到拷貝與賦值,結構體需要重載operator=符號;比較容器分成相等與不等,相等時重載operator==符號,不等時重載operator<符號。比如set、map、multiset、multimap、priority_queue等容器類要求重載operator<符號。
16
Map/Multimap,Sets/Multisets都不能用push_back,push_front,因為它是自動排序的。

Set內(nèi)的相同數(shù)值的元素只能出現(xiàn)一次,Multisets內(nèi)可包含多個數(shù)值相同的元素。

Map內(nèi)的相同數(shù)值的元素只能出現(xiàn)一次,Multimap內(nèi)可包含多個數(shù)值相同的元素。內(nèi)部由二叉樹實現(xiàn),便于查找。

17、string 與 數(shù)字之間的轉換,轉換的方法有很多種,一般使用stringstream來實現(xiàn)轉換。比如:

#include??<iostream>

#include??<sstream>??

#include??<string>??

using???namespace???std;??

int???main()??

{??

??int???i=0;??

??string???temp;????

??stringstream???s;??

??//string轉換為數(shù)字

??temp = “1234”;?

??s<<temp;??

??s>>i;??

??cout<<i<<endl;??

?

?//數(shù)字轉換為string

?i=256;

?s<<i;

?temp = s.str();

?cout<<temp<<end;

?

?system("pause");??

?return???0;

}

?

18、對于自定義的結構體,放入容器中,最好不要對容器進行內(nèi)存初始化(不要調(diào)用memset,zeromemory函數(shù)),否則如果結構體中有指針類型的變量時,就會出現(xiàn)問題。

?

19Vector的函數(shù)泄漏問題

定義了一個

struct temp

{

?????char name[256];

?????int i;

}

Vector<temp> vect;

當對這個vect執(zhí)行pushback一些temp的結構體后,執(zhí)行clear這樣是否會內(nèi)存泄露?可以釋放掉temp結構體中的name內(nèi)存嗎?

解決方法:

不行,clear只是把那些元素全部刪除掉,并不是釋放內(nèi)存。再者,你這樣的定義容器是不需要釋放內(nèi)存的,如果你這樣定義,std::vector <temp> *pVec。就需要了。先pVec->clear()?pVec->swap( (std::vector <temp>)(*pVec) )。就能實現(xiàn)內(nèi)存的釋放。??

?

20、stl之map erase方法的正確使用
STL的map表里有一個erase方法用來從一個map中刪除掉指令的一個節(jié)點,不存在任何問題。
如果刪除多一個節(jié)點時,需要使用正確的調(diào)用方法。比如下面的方法是有問題:
for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter)
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter);
}
這是一種錯誤的寫法,會導致程序行為不可知.究其原因是map 是關聯(lián)容器,對于關聯(lián)容器來說,如果某一個元素已經(jīng)被刪除,那么其對應的迭代器就失效了,不應該再被使用;否則會導致程序無定義的行為。

正確的使用方法:
1).使用刪除之前的迭代器定位下一個元素。STL建議的使用方式
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter++);
}

或者
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
ITER iterTmp = iter;
iter++;
cout<<iterTmp->first<<":"<<iterTmp->second<<endl;
mapTest.erase(iterTmp);
}

2). erase() 成員函數(shù)返回下一個元素的迭代器
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout<<iter->first<<":"<<iter->second<<endl;
iter=mapTest.erase(iter);
}

?21、boost::bind總結?
bind 是一組重載的函數(shù)模板.用來向一個函數(shù)(或函數(shù)對象)綁定某些參數(shù). bind的返回值是一個函數(shù)對象.?
性質(zhì):
不是函數(shù),是一個class,是一個多元仿函數(shù)

模板參數(shù):
帶模板參數(shù),但不需要,會自動推導!

構造函數(shù)參數(shù):
格式:_需要綁定類型,_參數(shù)1,_參數(shù)2,_參數(shù)3,_參數(shù)4…

_需要綁定類型:可以是普通函數(shù),類成員函數(shù),成員變量

_參數(shù)N:可以是一個占位符,或者實際參數(shù)。

如果綁定的類型是一個類成員函數(shù)或變量,那么第一個參數(shù)必須是對象或者對象指針。
仿函數(shù)參數(shù):
任意

仿函數(shù)返回值
?????? 如果綁定的是函數(shù),返回綁定函數(shù)的返回值。

?????? 如果綁定是成員變量,返回成員變量值

占位符:
_1,_2,_3,_4….._9

占位符的數(shù)字表示仿函數(shù)時對應參數(shù)的位置。

一個bind里可以嵌入多個bind,但占位符是相對于這一塊的bind是共享。

注意事項
a)如果綁定的是類函數(shù),傳入對象時,最好使用對象指針,如果使用對象實例會產(chǎn)生多次對象復制。如果非要傳對象而不想多次被復制傳在在使用ref或cref(ref的const版)

b)?跟lambda混用時一定要特別小心

第一、?? 會與lambda的占位符有沖突

第二、?? lambda庫里有跟同樣名字的bind,功能類似,但沒有此功能強大

總結
無模板參數(shù),構函數(shù)對綁定函數(shù)負責,仿函數(shù)是任意的。

?

舉例說明
例一:


void nine_arguments(

?????????????????????? int i1,int i2,int i3,int i4,

?????????????????????? int i5,int i6,int i7,int i8, int i9) {

??????????????????????????? std::cout << i1 << i2 << i3 << i4 << i5

???????????????????????????????? << i6 << i7 << i8 << i9 << '/n';

}

?

int main() {

???? int i1=1,i2=2,i3=3,i4=4,i5=5,i6=6,i7=7,i8=8,i9=9;

???? (boost::bind(&nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7))

???????? (i1,i2,i3,i4,i5,i6,i7,i8,i9);

}
輸出結果921638457

?

推薦書籍:

《C++標準程序庫》本書將焦點放在標準模板庫(Standard Template Library)身上,檢驗其中的容器(containers)、迭代器(iterators)、仿函數(shù)(functors)和算法(algorithms)。你還可以找到特殊容器、字符串(strings)、數(shù)值類別、國際化議題、IOStream。每一個組件都有深刻的呈現(xiàn),包括其介紹、設計、運用實例、細部解說、陷阱、意想不到的危險,以及相關類別和函數(shù)的確切標記(signature)和定義。一份見解深刻的基礎概念介紹和一個程序庫綜合鳥瞰,會對新手帶來快速的提升。

《泛型編程與STL》闡述了泛型程序設計的中心觀念:concepts,modeling, refinement,并為你展示這些觀念如何導出?STL?的基礎概念:iterators, containers, function objects.循此路線,你可以把?STL?想象為一個由?concepts(而非明確之?functions?classes)組成的?library.你將學習其正式結構并因此獲得其潛在威力之完整優(yōu)勢.

《Effective STL》闡述了如何有效地使用STLStandard Template Library,?標準模板庫)進行編程。書中講述了如何將STL組件組合在一起,從而利用庫的設計。這些內(nèi)容會幫助你針對簡單的問題開發(fā)出簡單、直接的解決方案,并且針對復雜的問題開發(fā)出精致的解決方案。書中還描述了常見的STL使用錯誤,并告訴你如何避免這些錯誤。

《STL源碼剖析》了解源碼,看到vector的實現(xiàn)、list的實現(xiàn)、heap的實現(xiàn)、deque的實現(xiàn)、RB-tree的實現(xiàn)、hash-table的實現(xiàn)、set/map?的實現(xiàn);你將看到各種算法(排序、搜尋、排列組合、數(shù)據(jù)移動與復制)的實現(xiàn);你甚至將看到底層的memory pool?和高階抽象的traits?機制的實現(xiàn)。

STL China?網(wǎng)站:http://www.stlchina.org/

總結

以上是生活随笔為你收集整理的STL详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

日本激情中文字幕 | 九九热免费在线视频 | 国产做aⅴ在线视频播放 | 深爱婷婷激情 | 在线播放日韩 | 91传媒在线观看 | 日韩av一区二区三区在线观看 | 九九热精品视频在线播放 | 国产一区二区免费 | 国产精品综合在线观看 | 园产精品久久久久久久7电影 | 免费看黄色小说的网站 | 天堂网av 在线 | 成人免费一区二区三区在线观看 | 亚洲黄色免费在线 | 日日干日日 | 欧美综合久久久 | 国产中文字幕在线视频 | 成年人免费在线观看网站 | 欧美精品久久久久久久亚洲调教 | 日韩免费视频一区二区 | 免费av网站观看 | 久久福利小视频 | 中文字幕在线国产 | 精品9999| 精品久久九九 | 国产999久久久| 精品国产乱码一区二 | 国模视频一区二区三区 | 中文字幕日韩有码 | 亚洲 欧美 国产 va在线影院 | 激情视频区 | av网站免费看 | 又污又黄的网站 | 日韩视频区| 久久99精品久久久久久三级 | 久久成人国产精品 | 日韩精品一区二区三区第95 | 久久精品99久久久久久 | 2024av| 国产伦理久久精品久久久久_ | aaa日本高清在线播放免费观看 | av成人免费| 91综合视频在线观看 | 国产一级视频在线免费观看 | 亚洲午夜av久久乱码 | 久久久午夜电影 | 久久久久国产成人精品亚洲午夜 | 视频99爱 | 日韩中文在线字幕 | 久久精品国产亚洲aⅴ | 亚洲三级毛片 | 夜夜躁日日躁狠狠久久av | 夜夜操综合网 | 2020天天干夜夜爽 | 国产色妞影院wwwxxx | 久久久婷| 国产国语在线 | 黄色小视频在线观看免费 | 在线免费观看黄网站 | 欧美午夜精品久久久久久孕妇 | 国产亚洲小视频 | 久久综合久久鬼 | 色综合久久88色综合天天人守婷 | 在线观看国产麻豆 | 狠狠干成人综合网 | 伊人午夜视频 | 国产精品美女免费看 | 国产无遮挡又黄又爽在线观看 | 久久久久久高潮国产精品视 | 97在线观看免费高清完整版在线观看 | 黄色av影视| 在线色亚洲 | 日韩av电影免费在线观看 | 久久久久免费看 | 国产精品网站一区二区三区 | 99久久久免费视频 | 91精品久久久久久综合五月天 | 成人一区二区三区在线 | 日韩特黄av | .精品久久久麻豆国产精品 亚洲va欧美 | 亚洲欧洲精品一区 | 中文字幕在线观看第三页 | 免费观看黄 | 九九久久精品视频 | 欧美 激情在线 | 成人在线免费观看网站 | 黄色成人av在线 | 97国产人人 | 96国产精品 | 中文字幕亚洲欧美日韩2019 | 中文字幕av电影下载 | 久久夜视频 | 韩国av免费| 午夜精品久久久99热福利 | 色综合天天综合网国产成人网 | 久久在线 | 国产一级片网站 | 91精品国产一区 | 亚洲精品美女久久 | 日本一区二区三区视频在线播放 | 日韩久久久久久久 | 五月婷丁香 | 天天射综合网视频 | 精品毛片一区二区免费看 | 天天操·夜夜操 | 少妇性色午夜淫片aaaze | 午夜免费视频网站 | 亚洲另类视频 | 18女毛片 | 亚洲美女在线一区 | 美女黄频 | 91网站观看| 国产麻豆剧果冻传媒视频播放量 | 中文日韩在线视频 | 日韩亚洲在线 | 顶级欧美色妇4khd | 久久人人爽视频 | 国产精品一区二区av影院萌芽 | 国产视频不卡 | 97在线观看免费高清完整版在线观看 | 久章草在线观看 | 国产一级免费电影 | 久久爱资源网 | 99在线精品免费视频九九视 | av在线播放不卡 | 国产亚洲视频中文字幕视频 | 久久tv视频| 亚洲伦理电影在线 | 色国产精品一区在线观看 | 成人久久 | 麻豆91精品视频 | 久久婷亚洲五月一区天天躁 | 久久韩国免费视频 | 亚洲理论电影 | 一区二区成人国产精品 | 91视频三区 | 人人网人人爽 | 亚洲成av人影片在线观看 | 91精品国自产在线 | 成年人免费看av | 精品国产一区二区三区蜜臀 | av一级久久| 欧美一区影院 | 中文字幕在线影院 | 婷婷在线播放 | 精品免费久久久久久 | 亚洲精品啊啊啊 | 午夜久久精品 | 国产美女精品视频 | 欧美日韩激情网 | 麻豆视频大全 | 免费看的毛片 | 特级a老妇做爰全过程 | 97综合在线 | 天天曰视频 | 一级欧美一级日韩 | www.久久精品视频 | 国产美女网站在线观看 | 日韩免费视频播放 | 免费日韩 精品中文字幕视频在线 | 中文久久精品 | 国产精品成人一区 | 人人干在线 | 在线色吧 | 国产色a在线观看 | 日韩av电影中文字幕在线观看 | 日韩毛片精品 | 另类五月激情 | 最近中文字幕高清字幕免费mv | 91精品在线免费视频 | 伊人成人激情 | 久久r精品 | 91中文字幕在线播放 | 日韩免费一区二区在线观看 | 丁香九月激情 | 久久久国产精华液 | 久久久亚洲网站 | 狠狠操狠狠干天天操 | 中文字幕视频一区二区 | 午夜性生活片 | 97视频人人澡人人爽 | 色视频成人在线观看免 | 色老板在线 | 午夜色大片在线观看 | 天天操天天玩 | 在线免费高清视频 | 精品视频免费播放 | 久久精品国产第一区二区三区 | 成人app在线播放 | 99热在线国产 | 久草视频在线资源 | 国产视频在线观看一区 | 黄色片网站大全 | 久久精品视频观看 | 日韩专区在线观看 | 在线观看国产www | 亚洲精品国精品久久99热 | 韩国精品视频在线观看 | 国产无遮挡又黄又爽馒头漫画 | 5月丁香婷婷综合 | 高清国产在线一区 | 婷婷综合五月天 | 免费三级黄 | 91在线视频精品 | 久久国产麻豆 | 国产精品12| 最新中文字幕在线播放 | 青青啪| 婷婷在线观看视频 | 久久精品123 | 五月婷婷在线视频 | 国产精品专区在线 | 六月丁香婷婷网 | 成人黄色电影在线播放 | 日日夜夜中文字幕 | 国产乱对白刺激视频不卡 | 亚洲日韩中文字幕 | 久草在线在线精品观看 | 亚洲精品五月 | 国产精品久久一区二区三区不卡 | 91精品免费在线观看 | 国产淫片免费看 | 在线看国产视频 | av在线超碰 | 国产女人40精品一区毛片视频 | 免费福利视频网站 | 色综合天天狠天天透天天伊人 | 国产码电影| 国产高清专区 | 在线精品一区二区 | 日韩欧美一区二区三区免费观看 | 奇米四色影狠狠爱7777 | 热久久国产精品 | 91豆花在线观看 | 中文字幕在线看视频 | 国产五月婷婷 | 伊人婷婷网 | a级片久久久 | 又黄又爽又无遮挡的视频 | 91色蜜桃 | 亚洲免费公开视频 | 国产乱对白刺激视频在线观看女王 | 国产视频在线免费观看 | 国产少妇在线观看 | 欧美一级看片 | 最新日韩在线观看视频 | 久久久久国产精品免费 | 97人人模人人爽人人喊中文字 | 国产在线欧美在线 | 免费网站v | 久久综合中文字幕 | 国产精品久久久久久吹潮天美传媒 | 色福利网| 国产成本人视频在线观看 | 999久久久国产精品 高清av免费观看 | 国产高清视频在线播放一区 | 欧美精品中文在线免费观看 | 人人玩人人弄 | 一区中文字幕在线观看 | 天天射天天干天天爽 | 国产九九九九九 | 久久久久久蜜av免费网站 | 国产视频精品免费播放 | 日韩美一区二区三区 | 一级黄色片在线观看 | 久久精品99国产精品酒店日本 | 9999在线视频 | 亚洲 欧美 91 | 日韩高清av | 九色在线视频 | 午夜影院日本 | 在线中文字幕av观看 | 在线观看日韩中文字幕 | 在线观看黄av | 欧美日韩综合在线观看 | 久久大视频 | 国产精品毛片一区二区 | 97超碰人人澡人人爱 | 日韩在线观看视频网站 | 久久久久久久久久久国产精品 | 96亚洲精品久久久蜜桃 | 国语自产偷拍精品视频偷 | 中文字幕av有码 | 五月天综合激情网 | 欧美黑人xxxx猛性大交 | a黄色大片| 天天色官网 | 人人爽人人乐 | 国产经典三级 | 九九热免费观看 | 久久黄色影视 | 亚洲免费精品一区二区 | 国产成人精品女人久久久 | 亚洲综合一区二区精品导航 | 99国内精品| 日日射天天射 | 伊人午夜视频 | 97色综合| 久草免费福利在线观看 | 欧美日韩视频在线观看免费 | 色香蕉视频 | 五月天综合婷婷 | 亚州精品成人 | 玖玖爱免费视频 | 在线观看视频免费播放 | 国产又黄又猛又粗 | 亚洲精品视频一二三 | 五月婷久久 | 91c网站色版视频 | 久久国产精品系列 | 91大神免费视频 | 国产在线精品一区二区不卡了 | 亚洲精品在线免费 | 日韩一片 | 欧美a级在线播放 | 最新日韩在线观看 | 中文在线免费观看 | 精品国产乱码久久久久 | 久久午夜影院 | 婷婷天天色 | 久久综合中文字幕 | 色是在线视频 | 亚洲视频,欧洲视频 | 婷婷综合网 | 激情 一区二区 | 精品国产日本 | 成人午夜影视 | 一区二区三区av在线 | 中文字幕欧美日韩va免费视频 | 久久综合色天天久久综合图片 | 五月天色网站 | 69国产精品视频免费观看 | 97超碰人人澡 | 蜜臀av性久久久久蜜臀av | 亚洲电影影音先锋 | 午夜精品久久久 | 制服丝袜在线 | 国产麻豆果冻传媒在线观看 | 免费在线精品视频 | 欧美大片mv免费 | 九月婷婷人人澡人人添人人爽 | 天天摸夜夜添 | 欧美另类v | 国产精品剧情在线亚洲 | 国产精品久久久久久久免费 | 久久精品精品电影网 | 欧美xxxxx在线视频 | 五月天堂色 | 狠狠的干 | 久久久综合香蕉尹人综合网 | 免费看色的网站 | 色播五月激情五月 | 国产成人精品综合 | 亚洲精品午夜久久久久久久久久久 | 91网在线 | av日韩在线网站 | 中文资源在线播放 | 亚洲 中文 在线 精品 | 亚洲国产剧情av | 久久久久久久久久久久久国产精品 | 一区二区三区精品在线 | 在线性视频日韩欧美 | 国产一区在线免费观看 | 欧美黄色特级片 | caobi视频| 丁香影院在线 | 综合视频在线 | 欧美视频99 | 香蕉视频91 | 色av资源网 | 成年人在线观看网站 | 免费看黄色91 | 国产精品毛片一区二区在线 | 91久久精品日日躁夜夜躁国产 | 亚洲天天 | 日韩欧美电影在线观看 | 激情久久久久久久久久久久久久久久 | 麻豆精品视频在线观看免费 | 免费看黄色毛片 | 国产亚洲精品久久久网站好莱 | 国内精品久久久久国产 | 天天爱天天射天天干天天 | 免费av的网站| 国产一级在线看 | 五月婷婷av在线 | 久久久久久久国产精品影院 | 亚洲精品66 | 日韩在线视频免费播放 | 99久久精品无码一区二区毛片 | 亚洲aⅴ在线 | 91在线蜜桃臀 | 91cn国产在线 | 九色91在线 | 超碰av在线免费观看 | 欧美一级片在线观看视频 | 91亚洲国产 | 欧洲不卡av| 日日爱999| 成人午夜电影网站 | 成年人天堂com | 在线免费观看视频一区 | 国产精品一区二区精品视频免费看 | 国产精品美女久久久久久 | 久久伊人爱 | 色婷婷在线观看视频 | 超碰人人超| 久草在线久草在线2 | 午夜av电影院 | 2021国产视频 | 精品国产一区二区三区四区在线观看 | 久久国内精品99久久6app | 国产精品久久久久久久久久久久久 | 亚洲永久精品国产 | 夜夜干夜夜 | 免费网站v | 人人藻人人澡人人爽 | 国产精品久久毛片 | 91av视频导航| 欧美激情精品久久久久久 | 亚洲一区二区观看 | 黄网站app在线观看免费视频 | 手机在线视频福利 | 波多野结衣在线观看视频 | 欧美日韩激情视频8区 | 精品一区精品二区高清 | 精品国产精品一区二区夜夜嗨 | 波多野结衣精品 | 日日操操| 亚洲欧美国产精品久久久久 | www国产亚洲精品久久麻豆 | 国产丝袜 | 久久毛片高清国产 | 亚洲精品国产精品国产 | 免费福利视频网 | 免费在线观看一区二区三区 | 久久成人黄色 | 九七在线视频 | 黄色国产高清 | 天天天天天天干 | 日韩在线视频不卡 | 97夜夜澡人人爽人人免费 | 国产精品久久久久9999 | 亚洲欧美国产精品久久久久 | 久久99热精品 | 欧美一级电影片 | 国产精品日韩在线播放 | 97香蕉超级碰碰久久免费软件 | 久久爽久久爽久久av东京爽 | 在线免费观看视频a | 人人爽人人香蕉 | 麻豆免费精品视频 | 亚洲欧美成人综合 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 97精品国产 | 日韩视频专区 | 国产麻豆传媒 | 免费视频在线观看网站 | 欧美一级激情 | 久久久久国产成人精品亚洲午夜 | 美女搞黄国产视频网站 | 国产一级高清视频 | 日日干av | 美女黄视频免费 | 精品久久一 | 一区二区精品视频 | 日韩一区二区三区高清在线观看 | 444av| 精品毛片一区二区免费看 | 丁香六月久久综合狠狠色 | jizzjizzjizz亚洲| 在线观看亚洲国产精品 | 国产小视频免费在线网址 | 欧美激情精品久久久久 | 久久久久国产成人免费精品免费 | 亚洲婷婷综合色高清在线 | 人人爽人人爽人人爽 | 久操视频在线观看 | 久久久电影 | 久草免费在线观看视频 | 成人在线观看免费视频 | 日韩电影中文 | 超碰97.com| 久久视频热| av网站在线观看免费 | 免费中午字幕无吗 | 丁香午夜婷婷 | 色99在线| 超碰在线免费福利 | 成片免费| 久久精品xxx| 成人a免费视频 | 亚洲成a人片在线观看网站口工 | 欧美日本啪啪无遮挡网站 | 免费观看9x视频网站在线观看 | 色偷偷av男人天堂 | 亚洲一区日韩在线 | 521色香蕉网站在线观看 | 手机在线免费av | 97在线免费 | 五月婷婷伊人网 | 欧美片网站yy | 999久久久久久久久久久 | 精品一区二区三区久久 | 人人爽人人香蕉 | 国产99久久久精品 | 国产在线小视频 | 国产视频在 | 九九九在线 | 国产区高清在线 | 日韩欧美视频免费在线观看 | aaa日本高清在线播放免费观看 | 国产精品久久久久久久7电影 | av三级av| 91网在线观看 | 国产精品久久久久免费观看 | 日韩在线高清 | 啪啪资源 | 国产免费高清视频 | 狠狠色丁香婷婷综合 | 亚洲伊人天堂 | 六月婷婷网 | 色网站在线免费观看 | 992tv又爽又黄的免费视频 | 9久久精品 | 国产色拍拍拍拍在线精品 | 久久国产精品免费观看 | 欧美久久久久久久久久久久 | 久久国产精品电影 | 亚洲福利精品 | 日韩免费高清在线 | 亚州激情视频 | 伊人五月天综合 | 亚洲另类在线视频 | 成人小视频在线播放 | 成年人免费在线看 | av 在线观看| 天天操天天摸天天干 | 久久久免费看片 | 久久久久国产一区二区三区四区 | 91成人免费视频 | 99精品在线视频播放 | 超碰精品在线观看 | 丰满少妇对白在线偷拍 | 91精品在线观看视频 | 美女在线观看网站 | 久草精品视频在线观看 | 国产精品成人av在线 | 久久久久精 | 久久久久免费精品视频 | 免费看黄20分钟 | 日韩高清 一区 | 国产精品黑丝在线观看 | 精品麻豆| 国产精品视频久久久 | 日韩精品不卡在线 | 久久久在线视频 | 黄色视屏在线免费观看 | 国产精品日韩欧美 | 在线小视频 | 亚洲天堂网视频 | 精品黄色在线 | 黄色小说免费观看 | 啪啪免费观看网站 | 国产黄色免费在线观看 | 国产在线观看国语版免费 | av中文国产 | 成人av电影免费 | 开心丁香婷婷深爱五月 | 久久久久久久久久亚洲精品 | 日韩乱码在线 | 国产系列 在线观看 | 丝袜美腿亚洲综合 | 国产精品免费在线播放 | 黄av免费在线观看 | 91精品日韩 | 97手机电影网 | 天天爽天天爽 | 亚洲综合欧美精品电影 | 日韩免费视频观看 | 久99久精品视频免费观看 | 国产高清在线免费 | 深爱五月激情五月 | 国产精品亚洲片夜色在线 | 亚洲区视频在线观看 | 激情文学丁香 | 欧美日韩国产页 | 韩国三级av在线 | 人人超碰97 | 超碰在线色 | 黄色片网站免费 | 麻豆精品在线 | 久久免费av电影 | 狠狠做深爱婷婷综合一区 | 日韩高清免费无专码区 | 国产偷国产偷亚洲清高 | 国产一区视频在线观看免费 | 91大神精品视频 | 91综合久久一区二区 | av国产在线观看 | 国产精品亚洲视频 | 99精品视频精品精品视频 | 久久五月婷婷综合 | 国产高清精品在线观看 | 超碰在线观看97 | 亚洲理论片在线观看 | 国产精品亚洲成人 | 国产黄色一级片在线 | 国产亚洲精品久久久久久无几年桃 | 一区精品在线 | 免费精品视频在线观看 | 国产亚洲高清视频 | 超碰免费公开 | 99久久精品午夜一区二区小说 | av+在线播放在线播放 | 涩涩资源网 | 99精品一区 | 久久久久久久久久久免费 | 欧美日韩精品二区第二页 | 在线观看www91 | 国产精品9999久久久久仙踪林 | 日韩手机在线 | 久久久人人爽 | 亚洲精品一区二区三区高潮 | 国产中文欧美日韩在线 | 久久视频这里有久久精品视频11 | 最近中文字幕免费大全 | 欧美日本在线观看视频 | 中文一区在线观看 | 日韩欧美精品在线 | 天堂av免费观看 | 午夜av色 | 亚洲国产中文字幕在线观看 | 久久久精品国产一区二区三区 | 四虎影视成人精品国库在线观看 | 久久tv| 中文字幕在线网 | 免费在线看v | 欧美一级电影免费观看 | 毛片网在线 | www.久久com| 日韩最新中文字幕 | 亚洲日本色 | 日韩激情在线视频 | 夜夜夜夜爽 | jizzjizzjizz亚洲| 久久av网 | 天天干天天怕 | 在线看片一区 | 日韩91在线 | 亚洲另类视频在线 | 成人av网站在线观看 | a v在线视频| 天天操天天操天天操天天操天天操天天操 | 亚洲免费一级 | 精品国产大片 | 国产精品美女久久久久久久 | 中文字幕刺激在线 | 日韩电影久久 | 成人av视屏 | 五月天六月丁香 | 欧美日韩不卡在线 | 美女国产在线 | 九九九视频精品 | 美女在线免费视频 | 国产第页| 一区二区三区在线免费播放 | 日韩精品一区在线观看 | 91精品国产电影 | 日韩三级视频在线观看 | 欧女人精69xxxxxx | www在线免费观看 | 久久福利 | 精品久久久久久久久久久久 | 亚洲开心激情 | 国内精品视频在线 | 精品一区 精品二区 | 久久久精品小视频 | 国产夫妻自拍av | 国产精品白浆 | 欧美日韩高清国产 | 中文字幕一区二区在线播放 | 国产原创av片 | 久久久久久毛片精品免费不卡 | 九九热只有精品 | 九九99视频| 亚洲视频第一页 | 色婷婷狠狠五月综合天色拍 | 国内精自线一二区永久 | 成年人免费电影在线观看 | 久久综合久久综合九色 | 亚洲激情在线观看 | 久久精品女人毛片国产 | 伊人影院av | 五月婷婷视频在线 | 成人在线视频观看 | 欧美午夜性| 久久久精品成人 | 最近最新最好看中文视频 | 日韩中文字幕电影 | 久久综合色婷婷 | 黄色大全免费观看 | 男女男视频 | 国产精品麻豆视频 | 美女网站在线播放 | 91中文在线视频 | 亚洲国产成人精品久久 | 四虎成人在线 | 在线观看你懂的网址 | 国产99久久久国产精品免费二区 | 四虎国产精品免费观看视频优播 | 96国产在线 | 国语精品视频 | 亚洲国产成人精品在线观看 | 97涩涩视频 | 久久在线免费视频 | 9ⅰ精品久久久久久久久中文字幕 | 亚洲欧美乱综合图片区小说区 | 国产精品永久免费观看 | 国产精品成人久久久久 | 国产免费久久 | 国产v欧美 | 久久草av | 亚洲一区欧美激情 | 视频在线观看入口黄最新永久免费国产 | 中文字幕人成一区 | 久草精品电影 | 99久久99久久精品国产片果冰 | 91九色国产蝌蚪 | 在线天堂8√ | 国产婷婷一区二区 | 国产亚洲高清视频 | 久久精品毛片 | 麻豆视频免费看 | 日韩视频二区 | 日本成人免费在线观看 | 丁香花在线视频观看免费 | 在线播放91 | 成人网看片 | 免费看片成年人 | 亚洲一区二区视频 | 国产日韩在线播放 | 欧美日韩另类在线 | 国产免费中文字幕 | 成人黄色资源 | 亚洲一区二区麻豆 | 国内毛片毛片 | 日韩精品在线观看视频 | 久久综合狠狠综合久久综合88 | 国产精品免费人成网站 | 91 中文字幕 | 久久综合精品一区 | 六月丁香婷婷久久 | 中文字幕国产精品一区二区 | 黄色毛片网站在线观看 | 超级碰碰碰视频 | 在线观看av的网站 | 天天综合天天综合 | 久久人人爽爽 | 国产99久久久欧美黑人 | 亚洲春色成人 | 国产成人三级在线 | 精品久久久久一区二区国产 | 97精品国产97久久久久久 | 成人av亚洲| 亚洲精品视频在线观看网站 | 欧美日韩在线看 | 在线观看免费中文字幕 | 免费看片网址 | 美女黄濒 | 日韩av中文 | avlulu久久精品 | 色视频网址 | 东方av在线免费观看 | 国产精品毛片久久久久久久 | 亚洲精品在线视频播放 | 国产精品爽爽爽 | 天天天天干 | 天天操天天摸天天射 | 久久精品国产成人 | 在线视频日韩精品 | 色综合天天综合 | 99 国产精品| 一本—道久久a久久精品蜜桃 | 免费观看成年人视频 | 国产成人精品一区二区在线 | 五月婷婷香蕉 | 久久亚洲区 | 日韩成人免费电影 | 五月天中文在线 | 欧美一级爽| 在线免费黄色片 | 99中文字幕视频 | 婷婷五月色综合 | 国产视| 天天色天天操综合网 | 9i看片成人免费看片 | h动漫中文字幕 | 国产精品成人国产乱一区 | 欧美激情视频一二区 | 四虎成人精品永久免费av九九 | 国产精品成人免费一区久久羞羞 | 91 在线视频 | 久久久久国 | 久久国产亚洲精品 | 国产免费三级在线观看 | 色综合久久88色综合天天 | 久久精品韩国 | 日韩视频免费在线 | 欧美性黑人 | 亚洲一区二区精品在线 | 国产精品 国产精品 | 在线日韩三级 | 三级黄色三级 | 久久久久久美女 | 精品国产视频在线观看 | 九九热免费观看 | 麻豆视频免费入口 | 久久爱导航 | 免费看黄在线看 | 亚洲欧美日韩一级 | 日日夜夜操av | 久久婷婷色综合 | 中文字幕视频观看 | 天天草天天操 | 国产在线传媒 | 欧美黄污视频 | 国产一区在线不卡 | 久久成人人人人精品欧 | 五月天国产精品 | 日韩资源在线播放 | 亚洲精品乱码久久久久久按摩 | 国产丝袜一区二区三区 | 国产欧美高清 | 天天操天天吃 | 狠狠狠的干| 日韩免费播放 | 少妇性bbb搡bbb爽爽爽欧美 | 色婷婷中文 | 涩涩资源网 | 在线观看黄网 | www.国产毛片 | 国产黄色av| 久久精品电影 | 婷婷资源站 | 91人人插| 成人超碰在线 | 久久视频热 | 青青河边草免费观看 | 国产丝袜高跟 | 欧美有色 | 嫩草av影院 | 成人亚洲欧美 | 国产麻豆视频免费观看 | 国产黄色精品视频 | 久久成人免费 | 91久久精品一区二区三区 | 日本精品视频在线播放 | 天天操天天爽天天干 | 久久99九九99精品 | 综合精品久久久 | 黄色软件大全网站 | 欧美一级片免费在线观看 | 精品国产乱码一区二 | 成人精品福利 | 97超碰香蕉 | 欧美视频日韩 | 人人精久 | 免费看黄电影 | 国产麻豆剧果冻传媒视频播放量 | 国产高清视频在线观看 | 久久久久久久国产精品视频 | 亚洲五月婷婷 | 99理论片 | 五月开心婷婷网 | 欧美少妇xxxxxx| 波多野结衣在线视频一区 | 欧美va在线观看 | 国产在线观看你懂的 | 黄色av电影免费观看 | 免费福利片2019潦草影视午夜 | 九九热中文字幕 | 久久久一本精品99久久精品66 | 9999国产| 久久久久久蜜av免费网站 | 精品久久久免费视频 | 97超碰在线视 | 欧美色婷| 人成在线免费视频 | 中文字幕一区二区三区在线视频 | 99色婷婷| 手机在线看片日韩 | 成人性生交视频 | 免费一级片在线观看 | 国产视频精品免费播放 | 99久久精品免费看国产一区二区三区 | 成年人免费在线播放 | 欧美一级视频在线观看 | 免费观看日韩 | av女优中文字幕在线观看 | 久久综合狠狠综合久久激情 | 欧美日韩国产精品一区 | 伊人色**天天综合婷婷 | 日韩视频免费观看高清完整版在线 | 69精品在线 | 亚洲成色777777在线观看影院 | 亚洲三级国产 | 日韩免费一级a毛片在线播放一级 | 久久天天操 | 亚洲精品久久久蜜桃直播 | 黄色午夜网站 | 色a资源在线 | 五月天综合| 丁五月婷婷| 91亚洲影院| www.玖玖玖 | 欧美大片在线看免费观看 | 国产99久久久国产精品免费看 | 伊人久久av | 久久精品久久精品久久精品 | 成年人网站免费在线观看 | 免费在线观看黄色网 | 日韩av成人在线观看 | 欧洲精品亚洲精品 | 五月天激情视频在线观看 | 99在线精品免费视频九九视 | 91av中文| 一区 二区 精品 | 波多野结衣一区二区三区中文字幕 | 五月婷婷开心中文字幕 | av在线播放免费 | 97人人艹| 伊人婷婷色 | 久久高清国产 | 日韩免费在线网站 | 日韩一级精品 | 久久99久久久久 | 国产一区免费观看 | 国产成人精品在线 | 国产成人免费在线 | 久久综合色综合88 | 久久久久中文字幕 | 日本99热 | 国产色区 | 欧美日本高清视频 | 午夜精品一区二区三区在线观看 | 国产91九色蝌蚪 | 久久99九九99精品 | 一区二区三区高清不卡 | 在线中文日韩 | 免费高清av在线看 | 成人国产精品 | 亚洲国产视频直播 | 黄色日视频 | 久久综合中文色婷婷 | 日韩动态视频 | 国内精品久久久久久久97牛牛 | 亚洲欧美日韩一区二区三区在线观看 | 天天综合网天天综合色 | 国产在线观看你懂得 | 98精品国产自产在线观看 | 亚洲第二色 | 一级黄色片在线播放 | 精品国产成人av在线免 | 97在线观视频免费观看 | 亚洲精品乱码久久久久久蜜桃91 | 午夜久久网站 | 国产中文字幕网 | 免费黄色网址大全 | 丁香五月亚洲综合在线 | 99在线观看精品 | 久久久久久久国产精品影院 | 人人爽人人爽人人片av免 | 久久综合九色九九 | 正在播放五月婷婷狠狠干 | 美女天天操 | 伊人婷婷综合 | 麻豆传媒一区二区 | 91亚洲精品久久久蜜桃网站 | 操操操综合 | 色婷婷www | 在线免费观看一区二区三区 | 91av看片| 色婷婷视频 | bayu135国产精品视频 | 久久99国产精品二区护士 | 日韩欧美高清不卡 | 手机在线中文字幕 | 日韩精品中文字幕久久臀 | 国产成人精品免费在线观看 | 国产福利精品视频 | 丝袜美腿av | 在线免费高清一区二区三区 | 欧美国产不卡 | 免费大片av| 中文字幕在线免费97 | 日本电影久久 | 91热视频 |