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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++容器的选择和详细操作方法总结(有自己总结)

發(fā)布時(shí)間:2024/4/18 c/c++ 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++容器的选择和详细操作方法总结(有自己总结) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述:C++容器是一個(gè)功能十分強(qiáng)大的庫(kù),利用好了這些容器資源,不僅可以提高書(shū)寫(xiě)代碼的速度,更重要的是還可以提高代碼的健壯性。這篇文章旨在盡可能詳細(xì)地說(shuō)明各種容器的優(yōu)缺點(diǎn)和適用場(chǎng)合以及最重要的就是如何使用。

主要內(nèi)容:本文章不會(huì)對(duì)其源代碼進(jìn)行深入分析,而是對(duì)其方法進(jìn)行詳細(xì)介紹,以便于在實(shí)際應(yīng)用中使用。

?

C++容器庫(kù)概述:

C++容器分為順序容器和關(guān)聯(lián)容器兩大類(lèi),其中順序容器主要包括vector,deque,list,forward_list,array,string六種,而關(guān)聯(lián)容器主要包括map,set,multimap,multiset,unordered_map,unordered_set,unordered_multimap,unordered_multiset八種,此外,針對(duì)于順序容器,標(biāo)準(zhǔn)庫(kù)還定義了三個(gè)適配器,分別是stack,queue,priority_queue。

?

敘述順序:

首先是介紹所有容器共有的屬性和獲取屬性的方法,然后介紹如何使用各種順序容器,然后總結(jié)各種順序容器的適用場(chǎng)合和優(yōu)缺點(diǎn)以及各種操作的對(duì)比,然后介紹各種適配器的使用,然后介紹如何使用各種關(guān)聯(lián)容器,最后總結(jié)各種關(guān)聯(lián)容器的適用場(chǎng)合和優(yōu)缺點(diǎn)以及各種操作的對(duì)比。對(duì)于每一種容器的操作,無(wú)非就是如何定義和初始化一個(gè)容器,然后就是訪問(wèn)方法,再就是如何修改容器。

?

注:本文章使用的容器庫(kù)為c++11標(biāo)準(zhǔn),使用的IDE為 visual studio 2017 。

?

一、順序容器共有屬性

1.共有的類(lèi)型別名:

類(lèi)型別名有7個(gè)可分為5類(lèi);

????第一類(lèi)是容器的迭代器類(lèi)型;

????第二類(lèi)是容器的大小類(lèi)型;

????第三類(lèi)是容器的兩迭代器之間的距離類(lèi)型;

????第四類(lèi)是容器中元素的元素類(lèi)型;

????第五類(lèi)是容器中元素的左值類(lèi)型(就是引用);

具體分別是:

第一類(lèi):iterator和const_iterator????reverse_iterator和const_reverse_iterator(反向迭代器)

第二類(lèi):size_type? (vector,string,deque才支持,list,forward_list,array不支持)

list支持 list_object.size()但是支持 list<elem_type>::size_type

第三類(lèi):difference_type(注意!迭代器運(yùn)算僅僅支持可變長(zhǎng)度線性存儲(chǔ)結(jié)構(gòu),即vector,string,deque;而list,forward_list和array則不支持)

第四類(lèi):value_type

第五類(lèi):reference和const_reference

下表是vector\string\deque\list\forward_list\array對(duì)size()和size_type的支持情況:

代碼示例:(以vector為例)

#include<iostream>
#include<vector>
#include<cstdlib>
?
using namespace std;
?
int main() {
?
?? ?vector<int> ival = { 1,2,3,4,5,6,7,8,9 };
?
?? ?//第一類(lèi)
?? ?cout << "使用普通迭代器遍歷輸出:";
?? ?for (vector<int>::iterator i = ival.begin();i != ival.end();++i) {
?? ??? ?cout << *i << " ";
?? ?}
?? ?cout << endl<<"使用常迭代器遍歷輸出";
?? ?for (vector<int>::const_iterator i = ival.begin();i != ival.end();++i) {//注意!這兒的begin與end獲取的迭代器發(fā)生了類(lèi)型轉(zhuǎn)換
?? ??? ?cout << *i << " ";
?? ?}
?? ?cout << endl;
?
?? ?//第二類(lèi)
?? ?cout << "使用下標(biāo)遍歷輸出:";
?? ?for (vector<int>::size_type i = 0;i < ival.size();++i) {
?? ??? ?cout << ival[i] << " ";
?? ?}
?? ?cout << endl;
?
?? ?//第三類(lèi)
?? ?cout << "使用的迭代器的差來(lái)獲取容器長(zhǎng)度:";
?? ?vector<int>::difference_type length = ival.end() - ival.begin();
?? ?cout << "長(zhǎng)度為" << length << endl;
?
?? ?//第四類(lèi)
?? ?cout << "使用元素類(lèi)型以及范圍for語(yǔ)句來(lái)遍歷容器:";
?? ?for (vector<int>::value_type x : ival) {
?? ??? ?cout << x << " ";
?? ?}
?? ?cout << endl;
?
?? ?//第五類(lèi)
?? ?cout << "使用元素引用來(lái)使原容器中每個(gè)元素的值增大1并輸出:";
?? ?for (vector<int>::reference x : ival) {
?? ??? ?++x;
?? ?}
?? ?for (auto x : ival) {
?? ??? ?cout << x << " ";
?? ?}
?? ?cout << endl;
?? ?cout << "使用元素常引用來(lái)遍歷輸出容器中元素:";
?? ?for (vector<int>::const_reference x:ival) {
?? ??? ?cout << x << " ";
?? ?}
?? ?cout << endl;
?
?
?
?? ?system("pause");
}
運(yùn)行結(jié)果:

2.共有的訪問(wèn)屬性的方法

總共有兩類(lèi):

????第一類(lèi)有三個(gè)分別是獲取容器的元素?cái)?shù)量、獲取容器中可保存元素的最大數(shù)量以及判斷該容器是否為空的方法;

????第二類(lèi)是獲取迭代器的方法,總共有8種方法;

具體分別是:

第一類(lèi):c.size()????c.max_size()????c.empty()

第二類(lèi):c.begin()和c.end()????c.cbegin()和c.cend()????c.rbegin()和c.rend()????c.crbegin()和c.crend()

代碼示例:(以vector為例)

#include<iostream>
#include<vector>
#include<cstdlib>
?
using namespace std;
?
int main() {
?
?? ?vector<int> ival = { 1,2,3,4,5,6,7,8,9 };
?
?? ?//第一類(lèi)
?? ?cout << "使用size()成員函數(shù)來(lái)獲取容器元素?cái)?shù)量:有" << ival.size() << "個(gè)元素" << endl;
?? ?cout << "使用max_size()成員函數(shù)來(lái)獲取容器當(dāng)前最大可存儲(chǔ)元素的數(shù)量:最大可存儲(chǔ)" << ival.max_size() << "個(gè)元素" << endl;
?? ?cout << "使用empty()成員函數(shù)來(lái)判斷容器是否為空:";
?? ?if (ival.empty()) {
?? ??? ?cout << "容器為空" << endl;
?? ?}
?? ?else
?? ?{
?? ??? ?cout << "容器不為空" << endl;
?? ?}
?
?? ?//第二類(lèi)
?? ?cout << "使用begin()與end()使容器中各個(gè)元素的值都擴(kuò)大二倍:現(xiàn)在容器中元素的值為 ";
?? ?for (vector<int>::iterator i = ival.begin();i != ival.end();++i) {
?? ??? ?(*i) *= 2;
?? ?}
?? ?for (auto x : ival) {
?? ??? ?cout << x << " ";
?? ?}
?? ?cout << endl;
?? ?cout << "使用cbegin()與cend()訪問(wèn)容器中的元素:";
?? ?for (vector<int>::const_iterator i = ival.cbegin();i != ival.cend();++i) {
?? ??? ?cout << *i << " ";
?? ?}
?? ?cout << endl;
?
?? ?cout << "使用rbegin()與rend()訪問(wèn)容器中的元素 ";
?? ?for (vector<int>::reverse_iterator i = ival.rbegin();i != ival.rend();++i) {
?? ??? ?cout << *i << " ";
?? ?}
?? ?cout << endl;
?? ?cout << "使用crbegin()與crend()訪問(wèn)容器中的元素:";
?? ?for (vector<int>::const_reverse_iterator i = ival.crbegin();i != ival.crend();++i) {
?? ??? ?cout << *i << " ";
?? ?}
?? ?cout << endl;
?
?? ?system("pause");
}
運(yùn)行結(jié)果:

?

二、順序容器

1.vector

(1)定義和初始化

對(duì)于vector的定義和初始化,有8種方法。可以分為五種場(chǎng)合看待;

????第一種是定義一個(gè)空的容器;

????第二種就是將一個(gè)新的容器定義為某個(gè)舊容器的副本;

????第三種就是使用多個(gè)重復(fù)的值初始化一個(gè)容器;

????第四種就是使用多個(gè)確定的值初始化一個(gè)容器;

????第五種就是使用另一個(gè)容器的迭代器來(lái)初始化一個(gè)新的容器。

????(其中除了第一種和第五種只有一種方法,其他的都有兩種方法。而那兩種方法的唯一區(qū)別就是一個(gè)是直接初始化,一個(gè)是值初始化。)

?

具體分別是:

第一種:vector<T> v1;

第二種:vector<T> v2(v1);????vector<T> v2=v1;

第三種:vector<T> v3(n,val);????vector<T> v3(n);

第四種:vector<T> v5{a,b,c...};????vector<T> v5={a,b,c...};

第五種:vector<T> v6(b,e);

?

代碼示例:

#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
?
using namespace std;
?
//遍歷輸出一個(gè)int型的vector對(duì)象
void Print(string name,vector<int> &ival) {
?? ?cout << "初始化方法:" << name <<" ?---> ?";
?? ?for (auto x : ival) {
?? ??? ?cout << x << " ";
?? ?}
?? ?cout << endl;
}
?
int main() {
?? ?//第一種
?? ?vector<int> v1;
?? ?v1.push_back(1);//這個(gè)操作是向這個(gè)空容器的后面加一個(gè)數(shù)字1
?
?? ?//第二種
?? ?vector<int> v2(v1);
?? ?vector<int> v3 = v1;
?
?? ?//第三種
?? ?vector<int> v4(10, 2);
?? ?vector<int> v5(10);//這個(gè)初始化方法有一個(gè)局限,就是每個(gè)對(duì)象必須有默認(rèn)的初始值,否則編譯不通過(guò)
?
?? ?//第四種
?? ?vector<int> v6{ 1,2,3,4,5,6 };
?? ?vector<int> v7 = { 1,2,3,4,5,6 };
?
?? ?auto begin = v7.cbegin() + 1, end = v7.cend() - 1;//只訪問(wèn)不改變時(shí)推薦使用const_iterator類(lèi)型的迭代器。
?? ?vector<int> v8(begin,end);
?
?? ?//以下遍歷輸出各種容器來(lái)查看各種容器中的內(nèi)容
?? ?Print("第一種", v1);
?? ?Print("第二種(1)", v2);
?? ?Print("第二種(2)", v3);
?? ?Print("第三種(1)", v4);
?? ?Print("第三種(2)", v5);
?? ?Print("第四種(1)", v6);
?? ?Print("第四種(2)", v7);
?? ?Print("第五種", v8);
?
?? ?system("pause");
}
運(yùn)行結(jié)果:

?

(2)訪問(wèn)容器

對(duì)于vector的訪問(wèn)可以分為四種方法:

????第一種是通過(guò)下標(biāo)進(jìn)行訪問(wèn);

????第二種是通過(guò)迭代器;

????第三種是通過(guò)at()成員函數(shù);

????第四種特殊的是獲取容器首尾元素引用;

具體分別是:

第一種:c[n]

第二種:(*i)????/*i是c的迭代器*/

第三種:c.at(n)

第四種:c.back()/*返回c尾元素引用*/????c.front()/*返回c首元素引用*/

代碼示例:

#include<iostream>
#include<vector>
#include<cstdlib>
?
using namespace std;
?
int main() {
?
?? ?vector<int> ival = { 1,2,3,4,5,6,7,8,9 };
?
?? ?//注意訪問(wèn)元素的時(shí)候一定要保證容器是非空的,否則進(jìn)行訪問(wèn)操作是未定義的。
?? ?//以下代碼使用各種訪問(wèn)方法輸出該容器的第3項(xiàng)元素(獲取的都是該元素的引用)
?? ?//第一種
?? ?cout << "第一種使用下標(biāo)訪問(wèn): ---> 該元素的值為" << ival[2] << endl;
?? ?//第二種
?? ?auto i = ival.cbegin() + 2;
?? ?cout << "第二種使用迭代器訪問(wèn): ---> 該元素的值為" << *i << endl;
?? ?//第三種
?? ?cout << "第三種使用at()成員函數(shù)訪問(wèn): ---> 該元素的值為" << ival.at(2) << endl;
?
?? ?//最后一種方法用于獲取首尾元素的引用(一定要注意是引用)
?? ?//第四種
?? ?cout << "第四種獲取該容器的尾元素的引用: ---> 該元素的值為" << ival.back() << endl;
?? ?cout << "第四種獲取該容器的首元素的引用: ---> 該元素的值為" << ival.front() << endl;
?
?? ?system("pause");
}
運(yùn)行結(jié)果:

?

?

(3)修改容器

修改vector容器的類(lèi)別可以分為三類(lèi):

第一類(lèi)是對(duì)一個(gè)定義好的vector對(duì)象賦值,包括三種情況:

????第一種是將一個(gè)容器值賦一個(gè)初值;

????第二種是交換兩個(gè)容器中的內(nèi)容;

????第三種是使用assign()方法進(jìn)行賦值;(assign的好處是可以跨容器賦值)

第二類(lèi)是向一個(gè)vector容器中添加一個(gè)或多個(gè)新的元素,對(duì)于插入的位置,都是在指定迭代器前面,也包括三種情況:

????第一種是在容器的后面插入單個(gè)元素;

????第二種是在容器任意位置插入單個(gè)元素;

????第三種是在容器任意位置插入多個(gè)元素;

(當(dāng)然,第一種情況完全是第二種情況的一個(gè)特例。不過(guò)使用的比較多就分別列出了)

第三類(lèi)就是從vector容器中刪除一個(gè)或多個(gè)元素也包括三種情況;

????第一種是刪除容器尾后元素;

????第二種是刪除容器中某個(gè)特定的元素;

????第三種是刪除容器中某個(gè)范圍的元素,當(dāng)然也可以是全部;

具體分別是:

第一類(lèi):

情況1:c1=c2;????c={a,b,c,...};

情況2:swap(c1,c2);????c1.swap(c2);

情況3:seq.assign(b,e);????seq.assign(列表(il));????seq.assign(n,t);

第二類(lèi):

情況1:c.push_back(t)和c.emplace_back(args);/*返回void*/

情況2:c.insert(p,t)和c.emplace(p,args);/*返回指向新添加的元素的迭代器*/

情況3:c.insert(p,n,t);????c.insert(p,b,e);????c.insert(p,il);/*插入n個(gè)相同元素,插入其他容器在迭代器b和e范圍中的元素,插入列表il中元素,都返回新添加的元素中第一個(gè)元素的迭代器*/

注:在以上方法中insert與emplace的唯一區(qū)別是前者是拷貝對(duì)象,而后者是構(gòu)造對(duì)象。

第三類(lèi):

情況1:c.pop_back()/*返回void*/

情況2:c.erase(p)/*返回被刪元素之后的元素的迭代器*/

情況3:c.erase(b,e)/*返回一個(gè)指向最后一個(gè)被刪元素之后元素的迭代器*/;????c.clear()/*清空,返回void*/

代碼示例:

#include<iostream>
#include<string>
#include<list>
#include<vector>
?
using namespace std;
?
void Print(string name,vector<int> &x) {
?? ?cout << name<<":";
?? ?for (auto i : x) {
?? ??? ?cout << i << " ";
?? ?}
?? ?cout << endl;
}
?
int main() {
?? ?vector<int> c1{ 1,2,3,4,5,6,7,8,9 };
?? ?Print("c1中元素:", c1);
?? ?vector<int> c2;
?? ?vector<int> c3;
?
?
?? ?cout << "第一類(lèi):" << endl;
?? ?cout << "第一種:" << endl;
?? ?c2 = c1;
?? ?Print("使用\'=\'賦值后c2中元素", c2);
?? ?c3 = { 9,8,7,6,5,4,3,2,1 };
?? ?Print("使用列表賦值后c3中元素", c3);
?? ?cout << endl;
?
?? ?cout << "第二種:" << endl;
?? ?cout << "將c2與c3中的元素交換:" << endl;
?? ?cout << "未交換前:" << endl;
?? ?Print("c2中元素", c2);
?? ?Print("c3中元素", c3);
?? ?cout << "交換后:" << endl;
?? ?swap(c2, c3);
?? ?Print("使用swap(c1,c2)交換后c2中元素", c2);
?? ?Print("使用swap(c1,c2)交換后c3中元素", c3);
?? ?cout << "現(xiàn)在使用另外一種交換方法交換回來(lái):" << endl;
?? ?c2.swap(c3);
?? ?Print("使用c1.swap(c2)交換后c2中元素", c2);
?? ?Print("使用c1.swap(c2)交換后c3中元素", c3);
?? ?cout << endl;
?
?? ?cout << "第三種:" << endl;
?? ?vector<int> c4;
?? ?vector<int> c5;
?? ?vector<int> c6;
?? ?list<int> c7 = { 1,3,1,4 };
?? ?cout << "使用assign將c7中的元素拷貝到c4中:" << endl;
?? ?c4.assign(c7.cbegin(), c7.cend());
?? ?Print("現(xiàn)在c4中的元素為", c4);
?? ?cout << "使用assign將c5初始化為{7,4,1,7,4,1}:" << endl;
?? ?c5.assign({ 7,4,1,7,4,1 });
?? ?Print("現(xiàn)在c5中的元素為", c5);
?? ?cout << "使用assign將c6初始化為7個(gè)1" << endl;
?? ?c6.assign(7, 1);
?? ?Print("現(xiàn)在c6中的元素為", c6);
?? ?cout << "\n\n";
?
?? ?cout << "第二類(lèi):" << endl;
?? ?cout << "第一種:" << endl;
?? ?cout << "使用push_back()在c1后面添加數(shù)字10:" << endl;
?? ?int num1 = 10;
?? ?c1.push_back(num1);//或者直接c1.push_back(10);
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?
?? ?cout << "使用emplace_back()在c1后面添加數(shù)字11:" << endl;
?? ?int num2 = 11;
?? ?c1.emplace_back(num2);//或者直接c1.emplace_back(11);
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?? ?cout << endl;
?
?? ?cout << "第二種" << endl;
?? ?cout << "使用insert()在c1的第三項(xiàng)之前插入新的數(shù)字100:" << endl;
?? ?auto v1 = c1.cbegin() + 2;
?? ?v1=c1.insert(v1, 100);
?? ?cout <<"新添加的元素是"<< *v1<<endl;
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?
?? ?cout << "使用emplace()在c1的第三項(xiàng)之前插入新的數(shù)字200:" << endl;
?? ?v1 = c1.emplace(v1, 200);
?? ?cout << "新添加的元素是" << *v1 << endl;
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?? ?cout << endl;
?
?? ?cout << "第三種" << endl;
?? ?cout << "使用insert()在c1的第三項(xiàng)之前插入4個(gè)300:" << endl;
?? ?auto v2 = v1;
?? ?v2 = c1.insert(v2, 4, 300);
?? ?cout << "新添加的元素是4個(gè)" << *v2 << endl;
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?
?? ?cout << "使用insert()在c1的第三項(xiàng)之前插入容器c3中的第3到7項(xiàng):" << endl;
?? ?auto v3 = v2;
?? ?v3 = c1.insert(v3, c3.cbegin() + 2, c3.cbegin() + 6);
?? ?cout << "新添加的元素是";
?? ?for (auto x = c3.cbegin() + 2;x != c3.cbegin() + 6;++x) {
?? ??? ?cout << *x << " ";
?? ?}
?? ?cout << endl;
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?
?? ?cout << "使用insert()在c1的第三項(xiàng)之前插入{400,500,600,700}"<<endl;
?? ?auto v4 = v3;
?? ?v4 = c1.insert(v4, { 400,500,600,700 });
?? ?cout << "新插入的元素是";
?? ?for (auto i = c1.cbegin() + 2;i != c1.cbegin() + 6;++i) {
?? ??? ?cout << *i << " ";
?? ?}
?? ?cout << endl;
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?? ?cout << "\n\n";
?
?? ?cout << "第三類(lèi)" << endl;
?? ?cout << "第一種" << endl;
?? ?cout << "使用pop_back()在c1后面刪除一個(gè)元素:" << endl;
?? ?c1.pop_back();
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?? ?cout << endl;
?
?? ?cout << "第二種"<<endl;
?? ?cout << "使用erase()刪除c1的第三項(xiàng):" << endl;
?? ?int d = *(c1.cbegin() + 2);
?? ?auto v5=c1.erase(c1.cbegin() + 2);
?? ?cout << "刪除的元素是" << d << ",現(xiàn)在迭代器v5指向的元素是"<<*v5<<endl;
?? ?Print("現(xiàn)在c1中的內(nèi)容變成了", c1);
?? ?cout << endl;
?
?? ?cout << "第三種" << endl;
?? ?cout << "使用erase()刪除c1從第5項(xiàng)到10項(xiàng)的全部元素:" << endl;
?? ?cout << "刪除的元素是:";
?? ?for (auto i = c1.cbegin() + 4;i != c1.cbegin() + 9;++i) {
?? ??? ?cout << *i << " ";
?? ?}
?? ?cout << endl;
?? ?c1.erase(c1.cbegin() + 4, c1.cbegin() + 9);
?? ?
?? ?cout << "使用clear()清空c1中的所有元素:" << endl;
?? ?c1.clear();
?? ?cout << "c1現(xiàn)在是空的嗎?";
?? ?if (c1.empty()) {
?? ??? ?cout << "是的" << endl;
?? ?}
?? ?else
?? ?{
?? ??? ?cout << "不是" << endl;
?? ?}
?? ?
?? ?system("pause");
}
運(yùn)行結(jié)果:

?

2.list

(1)初始化方法

對(duì)于list的初始化,與vector完全相同,這里不再重復(fù)

(2)訪問(wèn)方法

相比于vector,list不支持隨機(jī)訪問(wèn),即使用下標(biāo)訪問(wèn)和使用at()成員函數(shù)是無(wú)效的。還有一個(gè)重要的區(qū)別就是list的迭代器僅支持++、--和*運(yùn)算,對(duì)于兩個(gè)迭代器的差和迭代器和數(shù)字運(yùn)算是不支持的。

(3)修改方法

修改方法除了支持vector的全部操作以外,還有兩個(gè)新的操作,就是在容器頭部進(jìn)行插入

具體有兩種方法,分別是

push_front和emlace_front

代碼示例

#include<iostream>
#include<cstdlib>
#include<string>
#include<list>
?
using namespace std;
?
void Print(string name, list<int> ilist) {
?? ?cout << name << ":";
?? ?for (auto x : ilist) {
?? ??? ?cout << x << " ";
?? ?}
?? ?cout << endl;
}
?
int main() {
?? ?list<int> c1 = { 1,2,3,4,5,6,7 };
?? ?Print("當(dāng)前c1中的元素為", c1);
?? ?cout << "使用push_front()在c1前面插入一個(gè)數(shù)字0:" << endl;
?? ?c1.push_front(0);
?? ?Print("當(dāng)前c1中的元素為", c1);
?? ?cout << "使用emplace_front()在c1前面插入一個(gè)數(shù)字-1:" << endl;
?? ?c1.emplace_front(-1);
?? ?Print("當(dāng)前c1中的元素為", c1);
?? ?system("pause");
}
運(yùn)行結(jié)果:

3.deque

deque除了支持vector的全部操作,還支持前插操作(即使用push_front和emplace_front方法)

4.array

對(duì)于array來(lái)說(shuō),容器一經(jīng)定義其大小就是固定的了。所以定義的時(shí)候要指明其大小。

(1)定義和初始化

定義和初始化

對(duì)于array來(lái)說(shuō),定義和初始化的操作分為三種,

????第一種是定義一個(gè)沒(méi)有賦任何值得“空”數(shù)組;

????第二種是定義為一個(gè)其他容器的副本;

????第三種就是定義為一個(gè)初始化列表中的元素;

對(duì)比于vector,array不支持同時(shí)賦多個(gè)同樣的值,另外還不支持迭代器范圍賦值

具體方法為:(以int為例)

????第一種 array<int,3> a1;

????第二種 array<int,3> a2(a1);????array<int,3> a3=a1;

????第三種 array<int,3> a4{1,2,3};????array<int,3> a5={1,2,3};

代碼示例:

#include<iostream>
#include<cstdlib>
#include<string>
#include<array>
?
using namespace std;
?
void Print(string name,array<int, 3> iarray) {
?? ?cout << name << ":";
?? ?for (auto x : iarray) {
?? ??? ?cout << x << " ";
?? ?}
?? ?cout << endl;
}
?
int main() {
?? ?array<int, 3> a1;
?
?? ?array<int, 3> a2{ 1,2,3 };
?? ?array<int, 3> a3 = { 4,5,6 };
?
?? ?array<int, 3> a4(a2);
?? ?array<int, 3> a5 = a3;
?
?? ?Print("a2", a2);
?? ?Print("a3", a3);
?? ?Print("a4", a4);
?? ?Print("a5", a5);
?? ?system("pause");
}
運(yùn)行結(jié)果:

(2)訪問(wèn)容器

和vector完全一樣,這里不再贅述

(3)修改容器

array是一個(gè)長(zhǎng)度固定的數(shù)組,因此所有修改容器的操作都不能改變?nèi)萜鞯拇笮?/p>

以下是關(guān)于array的操作分類(lèi),一共有二類(lèi):

????第一類(lèi):對(duì)已經(jīng)定義好的array進(jìn)行賦值

????第二類(lèi):對(duì)兩個(gè)array中的內(nèi)容進(jìn)行交換

其中賦值操作是通過(guò)"="號(hào)進(jìn)行實(shí)現(xiàn)的,注意進(jìn)行賦值一定要保證array類(lèi)型的完全相同。

而交換是使用swap方法,也是有兩種。

具體代碼也不再一一展示

5.forward_list

這是一種前插式單向鏈表,不支持后插操作,也不支持從后向前遍歷

(1)定義和初始化

初始化方法與vector完全一樣,這里不再贅述

(2)訪問(wèn)容器

由于是前插式的鏈表,所以就沒(méi)有反向遍歷這種操作,因此也就不存在反向迭代器。另外一個(gè)值得注意的地方是forward_list沒(méi)有size()方法,因此要想正向遍歷一個(gè)forward_list容器,就只有兩種可選的方式,一種是使用正向迭代器,另一種就是使用范圍for語(yǔ)句。

因?yàn)樾枰诖吮淼那安坎迦胍恍﹥?nèi)容,所以還定義了一個(gè)指向表的首元素之前的一個(gè)不存在元素的一個(gè)迭代器,以便于在表的頭部插入數(shù)據(jù)。

具體方法為

lst.before_begin()和lst.cbefore_begin()

(3)修改容器

根據(jù)修改數(shù)據(jù)方式的不同,可以分為兩類(lèi)

????第一類(lèi)是插入數(shù)據(jù),有四種方法

????????第一種是在某個(gè)迭代器之后插入一個(gè)元素;

????????第二種是在某個(gè)尾后迭代器之后插入n個(gè)值;

????????第三種是在某個(gè)尾后迭代器之后插入另一個(gè)容器某一迭代器范圍內(nèi)的元素;

????????第四種是在某個(gè)迭代器之后插入一個(gè)初始化列表中的元素;

????第二類(lèi)是刪除數(shù)據(jù),有兩種方法

????????第一種是刪除某個(gè)迭代器之后的數(shù)據(jù)

????????第二種是刪除某個(gè)迭代器之間的數(shù)據(jù),不包括前迭代器的元素,但是包括后迭代器指向的元素

具體為:

????第一類(lèi)

????????第一種:lst.insert_after(p,t)和lst.emplace_after(p,args);

????????第二種:lst.insert_sfter(p,n,t);

????????第三種:lst.insert_after(p,b,e);

????????第四種:lst.insert_after(p,il);

????第二類(lèi)

????????第一種:lst.erase_after(p);

????????第二種:lst.erase_after(b,e);

代碼示例:

#include<iostream>
#include<cstdlib>
#include<forward_list>
#include<vector>
#include<string>
?
using namespace std;
?
void Print(string name, const forward_list<int> &iflist) {
?? ?cout << name << ":";
?? ?for (auto x : iflist) {
?? ??? ?cout << x << " ";
?? ?}
?? ?cout << endl;
}
?
int main() {
?? ?forward_list<int> c1 = { 1,2,3,4,5,6,7 };
?? ?vector<int> c2(c1.begin(), c1.end());
?
?? ?cout << "第一類(lèi):" << endl;
?? ?cout << "在c1前面插入一個(gè)元素0" << endl;
?? ?c1.insert_after(c1.cbefore_begin(),0);
?? ?Print("現(xiàn)在c1中的元素為", c1);
?? ?cout << "在c1前面再插入5個(gè)-1" << endl;
?? ?c1.insert_after(c1.cbefore_begin(), 5, -1);
?? ?Print("現(xiàn)在c1中的元素為", c1);
?? ?cout << "在c1前面插入c2的第二到5個(gè)位置的元素" << endl;
?? ?c1.insert_after(c1.before_begin(), c2.begin() + 1, c2.begin() + 5);
?? ?Print("現(xiàn)在c1中的元素為", c1);
?? ?cout << "在c1前面插入列表{100,200,300}中的元素" << endl;
?? ?c1.insert_after(c1.cbefore_begin(), { 100,200,300 });
?? ?Print("現(xiàn)在c1中的元素為", c1);
?
?? ?cout << "\n\n";
?? ?cout << "第二種" << endl;
?? ?cout << "將c1的首元素刪除" << endl;
?? ?c1.erase_after(c1.cbefore_begin());
?? ?Print("現(xiàn)在c1中的元素為", c1);
?
?? ?auto i1 = c1.before_begin();
?? ?auto i3 = c1.begin();
?? ?for (int i = 0; i < 10; ++i) {
?? ??? ?++i3;
?? ?}
?? ?cout << "刪除c1前面10個(gè)元素" << endl;
?? ?cout << "被刪除的元素為:" << endl;
?? ?for (auto i = c1.begin(); i != i3; ++i) {
?? ??? ?cout << *i << " ";
?? ?}
?? ?cout << endl;
?
?? ?c1.erase_after(i1, i3);
?? ?Print("現(xiàn)在c1中的元素為", c1);
?
?? ?system("pause");
}
運(yùn)行結(jié)果:

6.string

string可以看作是一個(gè)char型的vector容器,除了支持與vector<char>的全部操作外,還有額外的定義,訪問(wèn)和修改的方法。

以下只敘述string相比于vector<char>的額外的操作

這些操作的類(lèi)型要么是提供string類(lèi)與c風(fēng)格字符數(shù)組之間的相互轉(zhuǎn)換,要么是增加了允許我們使用下標(biāo)代替迭代器的版本

(1)構(gòu)造string的其他方法

構(gòu)造string的新方法可以分為兩種:

????第一種是提供從c風(fēng)格字符數(shù)組來(lái)進(jìn)行初始化的一個(gè)方法;

????第二種是提供從另一個(gè)string對(duì)象的下標(biāo)計(jì)算的部分初始化方法;

具體分別是:

????第一種:string s(cp,n);(新的string對(duì)象會(huì)被初始化為cp數(shù)組前n個(gè)字符)

????第二種:string s(s2,pos2);????string s(s2,pos2,len2); ????或者使用substr(eg:string s=s2.substr(0,5);<前閉后開(kāi)>,如果只有一個(gè)參數(shù),表明從某位置開(kāi)始截取,一直到串尾,如果沒(méi)有參數(shù),則等同于"="號(hào))。

程序示例:

#include<iostream>
#include<cstdlib>
#include<string>
?
using namespace std;
?
int main() {
?? ?const char a[20] = "hello world!!!";
?? ?cout << "a:" << a << endl;
?? ?cout << "將s1中的內(nèi)容初始化為a的前12個(gè)字符" << endl;
?? ?string s2(a, 12);
?? ?cout << "s2:" << s2 << endl;
?
?? ?cout << "將s3初始化為s2從下標(biāo)6開(kāi)始后的所有字符:" << endl;
?? ?string s3(s2, 6);
?? ?cout << "s3:" << s3 << endl;
?
?? ?cout << "將s4初始化為s3從下標(biāo)0開(kāi)始后的5個(gè)字符:" << endl;
?? ?string s4(s3, 0, 5);
?? ?cout << "s4:" << s4 << endl;
?
?? ?cout << "使用substr將s5初始化為s2從下標(biāo)6開(kāi)始的所有字符:" << endl;
?? ?string s5 = s2.substr(6);
?? ?cout << "s5:" << s5 << endl;
?
?? ?cout << "使用substr將s6初始化為s5從下標(biāo)0開(kāi)始后的5個(gè)字符:" << endl;
?? ?string s6 = s5.substr(0, 5);
?? ?cout << "s6:" << s6 << endl;
?
?? ?cout << "如果substr沒(méi)有參數(shù),則等同于\"=\"號(hào):" << endl;
?? ?string s7 = s2.substr();
?? ?cout << "s7:" << s7 << endl;
?
?? ?system("pause");
}
運(yùn)行結(jié)果:

?(2)改變string的其他方法

string為了與c風(fēng)格字符數(shù)組兼容以及支持使用下標(biāo)來(lái)進(jìn)行字符串的操作,重載了assign,insert和erase,另外還定義了append和replace兩個(gè)函數(shù)用來(lái)追加和替換容器。

具體分別是:

s.insert(pos,args) 在pos之前插入args指定的字符,pos可以是一個(gè)下標(biāo)或一個(gè)迭代器。接受下標(biāo)的版本返回一個(gè)指向s的引用;接受迭代器的版本返回指向第一個(gè)插入字符的迭代器。

s.erase(pos,len) 刪除從位置pos開(kāi)始的len個(gè)字符。如果len被省略,則刪除從pos開(kāi)始直至s末尾的所有字符。返回一個(gè)指向s的引用。

s.assign(args)????將s中的字符替換為args指定的字符。返回一個(gè)指向s的引用。

s.append(args) 將args追加到s。返回一個(gè)指向s的引用。

s.replace(range,args) 刪除s中范圍range內(nèi)的字符,替換為args指定的字符。range或者是一個(gè)下標(biāo)和一個(gè)長(zhǎng)度,或者是一對(duì)指向s的迭代器。返回一個(gè)指向s的引用。

args可以是下列形式之一;append和assign可以使用所有形式

str不能與s相同,迭代器b和e不能指向s

str 字符串str

str,pos,len????str中從pos開(kāi)始最多l(xiāng)en個(gè)字符

cp,len????從cp指向的數(shù)組前(最多)len個(gè)字符

cp????cp指向的以空字符結(jié)尾的字符數(shù)組

n,c????n個(gè)字符c

b,e????迭代器b和e指定范圍內(nèi)的元素

初始化列表。

replace和insert所允許的args形式依賴(lài)于range和pos是如何指定的

replace(pos,len,args)?? ?replace(b,e,args)?? ?insert(pos,args)?? ?insert(iter,args)?? ?args可以是
??? ???? ???? ???? ?str
??? ???? ???? ???? ?str,pos,len
??? ???? ???? ???? ?cp,len
??? ???? ???? ???? ?cp
??? ???? ???? ???? ?n,c
??? ???? ???? ???? ?b2,e2
??? ???? ???? ???? ?初始化列表
示例代碼:

#include<iostream>
#include<string>
#include<cstdlib>
?
using namespace std;
?
int main() {
?? ?string s("hello");
?? ?
?? ?//insert與erase:
?? ?cout << "s:" << s << endl;
?? ?//insert(pos,n,c)
?? ?s.insert(s.size(), 5, '!');//在s后面插入5個(gè)'!'
?? ?cout << "s:" << s << endl;
?? ?//erase(pos,len)
?? ?s.erase(s.size() - 5, 5);//在s后面刪除5個(gè)字符
?? ?cout << "s:" << s << endl << endl;
?
?? ?cout << endl;
?
?? ?//assign與insert:(c語(yǔ)言風(fēng)格字符串風(fēng)格)
?? ?const char *cp = "Stately,plump Buck";
?? ?//assign(cp,len)
?? ?s.assign(cp, 7);//s="Stately"
?? ?cout << "s:" << s << endl;
?? ?//insert(cp,len)
?? ?s.insert(s.size(), cp + 7);//s="Stately,plump Buck"
?? ?cout << "s:" << s << endl;
?
?? ?cout << endl;
?
?? ?//inser(字符串)
?? ?string s2 = "some string", s3 = "some other string";
?? ?cout << "s2:" << s2 << endl;
?? ?cout << "s3:" << s3 << endl;
?? ?//insert(pos,str)
?? ?s2.insert(0, s3);
?? ?cout << "s2:" << s2 << endl;
?? ?//insert(pos,str,pos,len)
?? ?s2.insert(0, s3, 0, s3.size());
?? ?cout << "s2:" << s2 << endl;
?
?? ?cout << endl;
?
?? ?//append與replace
?? ?string s4("C++ Primer"), s5 = s4;
?? ?s4.insert(s4.size(), " 5th Ed");//s4="C++ Primer 5th Ed"
?? ?s4.append(" 5th Ed");//與上面等價(jià)
?? ?cout << "s4:" << s4 << endl;
?? ?cout << "s5:" << s5 << endl;
?
?? ?//將5th替換為6th
?? ?s4.erase(11, 3);
?? ?s4.insert(11, "6th");
?? ?s4.replace(11, 3, "6th");//與上面等價(jià)
?? ?s4.replace(11, 3, "sixth");
?? ?cout << "s4:" << s4 << endl;
?
?
?? ?system("pause");
}
運(yùn)行結(jié)果

(3)string搜索操作

string類(lèi)提供了6個(gè)不同的搜索,每個(gè)搜索操作有4個(gè)重載版本,如果搜索成功,都返回匹配位置的下標(biāo),如果搜索失敗,則返回一個(gè)非常大的整數(shù)

6種搜索操作分別是:

????第一種:尋找s中args第一次出現(xiàn)的位置;

????第二種:尋找s中args最后一次出現(xiàn)的位置;

????第三種:在s中查找args任何一個(gè)字符第一次出現(xiàn)的位置

????第四種:在s中查找args任何一個(gè)字符最后一次出現(xiàn)的位置

????第五種:在s中查找第一個(gè)不在args中出現(xiàn)的字符

????第六種:在s中查找最后一個(gè)不在args中出現(xiàn)的字符

具體分別是:

????第一種:s.find(args);

????第二種:s.rfind(args);

????第三種:s.find_first_of(args);

????第四種:s.find_last_of(args);

????第五種:s.find_first_not_of(args);

????第六種:s.find_last_not_of(args);

args必須是以下形式之一?? ?功能描述
c,pos?? ?從s中位置pos開(kāi)始查找字符c。pos默認(rèn)為0
s2,pos

從s中位置pos開(kāi)始查找字符串s2.pos默認(rèn)為0

cp,pos?? ?相當(dāng)于s換成了字符數(shù)組cp
cp,pos,n?? ?
相當(dāng)于s換成了字符數(shù)組cp

????代碼示例1:

#include<iostream>
#include<cstdlib>
#include<string>
?
using namespace std;
?
//尋找某子串在主串中的數(shù)量,使用string的find()方法
int findAmount(const string &str, const string &childStr) {
?? ?auto x = str.find(childStr);
?? ?if ( x > str.size()) {
?? ??? ?return 0;//如果str中不存在childStr,那么x會(huì)是一個(gè)超級(jí)大的整數(shù),此時(shí)返回0;
?? ?}else{
?? ??? ?string temp(str, x + 1, str.size() - x - 1);//遞歸搜索后面的字符串
?? ??? ?return 1+findAmount(temp, childStr);
?? ?}
}
?
int main() {
?
?? ?string s1 = "aacvcaa aacvcaa aacvcaa aacvcaa";
?? ?string s2 = "cvc";
?? ?cout <<"子串"<<s2<<"在主串"<<s1<<"中的數(shù)量為"<<findAmount(s1, s2)<<endl;
?? ?system("pause");
}
運(yùn)行結(jié)果1:

代碼示例2:

#include<iostream>
#include<string>
#include<cstdlib>
?
using namespace std;
?
int main() {
?
?? ?string name("AnnaBelle");
?? ?auto pos1 = name.find("Anna");
?? ?cout << "pos1:" << pos1 << endl;
?
?? ?cout << endl;
?
?? ?//大小寫(xiě)敏感
?? ?string lowercase("annabelle");
?? ?pos1 = lowercase.find("Anna");
?? ?cout << "pos1:" << pos1 << endl;
?
?? ?string numbers("0123456789"), name1("r2d2");
?? ?auto pos = name1.find_first_of(numbers);
?? ?cout << "pos:" << pos << endl;
?
?? ?string dept("03714p3");
?? ?auto pos2 = dept.find_first_not_of(numbers);
?? ?cout << "pos2:" << pos2 << endl;
?
?? ?cout << endl;
?
?? ?//指定位置搜索
?? ?string::size_type pos3 = 0;
?? ?while ((pos3 = name1.find_first_not_of(numbers, pos3)) != string::npos) {
?? ??? ?cout << "在" << pos3 << "處發(fā)現(xiàn)數(shù)字" << name1[pos3] << endl;
?? ??? ?++pos3;
?? ?}
?
?? ?cout << endl;
?
?? ?//逆向搜索
?? ?string river("Mississippi");
?? ?auto first_pos = river.find("is");
?? ?cout << "first_pos:" << first_pos << endl;
?
?? ?auto last_pos = river.rfind("is");
?? ?cout << "last_pos:" << last_pos << endl;
?
?? ?system("pause");
}
運(yùn)行結(jié)果:

(4)string的compare函數(shù)

字符串的比較就是使用字典序比較,沒(méi)什么可說(shuō)的

返回值分三種,若s小于目標(biāo)串,則返回負(fù)數(shù),相等返回0,大于則返回正數(shù)。

使用方法為s.compare(args);

args可以是以下幾種形式之一:

s2:比較s與s2

pos1,n1,s2:將s中從pos1開(kāi)始的n1個(gè)字符與s2進(jìn)行比較

pos1,n1,s2,pos2,n2:將s中從pos1開(kāi)始的n1個(gè)字符與s2從pos2開(kāi)始的n2個(gè)字符進(jìn)行比較

cp:與c風(fēng)格字符串比較

pos1,n1,cp:從pos1開(kāi)始的n1個(gè)字符與cp比較

?

pos1,n1,cp,n2:從pos1開(kāi)始的n1個(gè)字符與cp后的n2個(gè)字符進(jìn)行比較

代碼示例:

#include<iostream>
#include<string>
#include<cstdlib>
?
using namespace std;
?
int main() {
?? ?const char *cp = "zzc_hello_world!";
?? ?string s1 = "ddfg_hello_world!!!";
?? ?string s2 = "jjjiur_hello_world!!";
?? ?
?? ?if (s1.compare(5, 5, s2, 7, 5) == 0) {
?? ??? ?cout << "局部相等" << endl;
?? ?}else {
?? ??? ?cout << "局部不相等" << endl;
?? ?}
?
?? ?if (s1.compare(5, 5, cp + 5, 5)) {
?? ??? ?cout << "局部相等" << endl;
?? ?}else {
?? ??? ?cout << "局部不相等" << endl;
?? ?}
?
?? ?system("pause");
}
運(yùn)行結(jié)果:

(5)string與數(shù)值之間進(jìn)行轉(zhuǎn)換的方法

字符串與數(shù)值之間的轉(zhuǎn)換,分兩種情況,字符串轉(zhuǎn)數(shù)值與數(shù)值轉(zhuǎn)字符串:

其中字符串轉(zhuǎn)數(shù)值又分為轉(zhuǎn)為整型數(shù)或浮點(diǎn)型數(shù)

to_string(val)轉(zhuǎn)字符串,有各種重載

?

stoi(s,p,b); string->int

stol(s,p,b); string->long

stoul(s,p,b); string->unsigned long

stoll(s,p,b); string->long long

stoull(s,p,b); string->unsigned long long

其中p是s中第一個(gè)數(shù)字字符,默認(rèn)為0,b是使用的進(jìn)制,默認(rèn)為10

?

stof(s,p); string->float

stod(s,p); string->double

stold(s,p); string->long double

s,p同上

示例代碼:

#include<iostream>
#include<string>
#include<cstdlib>
?
using namespace std;
?
int main() {
?? ?int i = 42;
?? ?string s = to_string(i);
?? ?double d = i + 0.5;
?? ?string s2 = to_string(d);
?? ?double d2 = stod(s2);
?? ?cout << "s:" << s << endl;
?? ?cout << "d2:" << d2 << endl;
?
?? ?string s3 = "PI=3.1415";
?? ?double d3 = stod(s3.substr(s3.find_first_of("+-.0123456789")));
?? ?cout << "d3:" << d3 << endl;
?? ?system("pause");
}
運(yùn)行結(jié)果:

7.在文章的最開(kāi)始,我們提到了c++還為這些順序容器提供了三種適配器,所謂適配器,就是使容器的行為看起來(lái)像其他的存儲(chǔ)結(jié)構(gòu)一樣,即棧,普通隊(duì)列和優(yōu)先隊(duì)列,優(yōu)先隊(duì)列就是按照某種規(guī)則排序的隊(duì)列。(stack,queue,priority_queue)

?

首先介紹所有適配器都具有的字段和函數(shù):

介紹就不說(shuō)了,都可以顧名思義:

size_type;????value_type;????container_type;(這個(gè)是實(shí)現(xiàn)適配器的底層類(lèi)型)????A a;(定義一個(gè)適配器)

A a(c);適配器帶有c容器的拷貝????關(guān)系運(yùn)算 ==,!=,<,<=,>,>=????a.empty();????a.size();????a.swap(b)????swap(a,b);

默認(rèn)情況下stack和queue是基于deque實(shí)現(xiàn)的,priority_queue是基于vector實(shí)現(xiàn)的

當(dāng)然他們都可以指定實(shí)現(xiàn)的容器:

例如:用list實(shí)現(xiàn)一個(gè)棧,則可以這樣寫(xiě):

stack<int,list<int>> istk_list;

其他的類(lèi)似

其中需要注意的是:

stack可以使用除array和forward_list以外的容器,queue相比stack不可使用vector,priority_queue相比stack不可使用list

?

下面是棧特有的操作:

s.pop(); 出棧,但不返回棧頂元素

s.push(item);????進(jìn)棧

s.emplace(args);????進(jìn)棧

s.top();????返回棧頂元素

?

下面是隊(duì)列特有的操作:

q.pop();????出隊(duì)列,但不返回棧頂元素

q.front();????返回首元素

q.back();????返回尾元素

q.push(item);????進(jìn)隊(duì)列

q.emplace(args);????進(jìn)隊(duì)列

其中優(yōu)先隊(duì)列不支持上面的back()操作,而優(yōu)先隊(duì)列還另外支持一個(gè)q.top()操作

下面是一個(gè)示例:

代碼:

#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<cstdlib>
?
using namespace std;
?
int main() {
?? ?vector<string> s{ "123", "456", "789" };
?? ?stack<string, vector<string>> str_stk(s);
?? ?cout << "棧str_stk的棧頂元素:" << str_stk.top() << endl << endl;;
?
?? ?stack<int> intStack;
?? ?int value;
?? ?for (size_t ix = 0; ix != 10; ++ix) {
?? ??? ?intStack.push(ix);
?? ?}
?? ?while (!intStack.empty()) {
?? ??? ?value = intStack.top();
?? ??? ?cout << value << " ";
?? ??? ?intStack.pop();
?? ?}
?? ?cout << endl << "棧空!" << endl;
?? ?
?? ?system("pause");
}
運(yùn)行結(jié)果:

?

常用的順序容器以及操作至此已全部敘述完畢:下面來(lái)看一看什么情況下應(yīng)該選取什么樣的容器才是最合適的:

1.首選vector,如果是字符操作和字符串操作,首選string

2.如果程序中有許多小的元素,而且可用空間不是很樂(lè)觀,則不要使用list或者forward_list

3.如果程序會(huì)隨機(jī)訪問(wèn)容器中的元素,則應(yīng)該使用vector或者deque

4.如果程序會(huì)頻繁的在容器中間插入或者刪除數(shù)據(jù),則優(yōu)先考慮使用list或者forward_list

5:如果程序只會(huì)頻繁的在容器的頭部和尾部進(jìn)行數(shù)據(jù)的插入和刪除,則應(yīng)優(yōu)先考慮使用deque

6:如果要先進(jìn)行頻繁改變后又進(jìn)行頻繁的隨機(jī)訪問(wèn),則有以下兩種推薦方案:

1)考慮使用assign方法將list或者forward_list中的元素拷貝到vectoe或者deque中再進(jìn)行操作

2)如果要進(jìn)行對(duì)輸入數(shù)據(jù)進(jìn)行即時(shí)排序,則應(yīng)考慮在vector尾后添加元素后再調(diào)用sort方法進(jìn)行排序。

7:如果既需要頻繁的中間插入,又需要頻繁的隨機(jī)讀取,則使用概率統(tǒng)計(jì)方法統(tǒng)計(jì)出哪種操作所占比重較大,則優(yōu)先考慮使用哪種有利于占比較大操作的容器,如果有時(shí)候兩種操作比重差不多大,則應(yīng)該進(jìn)行運(yùn)行時(shí)間測(cè)試,從而確定最佳容器以及最佳方案。
?

總結(jié)

以上是生活随笔為你收集整理的C++容器的选择和详细操作方法总结(有自己总结)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

欧洲高潮三级做爰 | 国产午夜精品一区二区三区嫩草 | 天天操天天操天天操 | 久久久免费看视频 | 黄色一级影院 | 久久久久在线观看 | 一区 在线观看 | 97小视频| 国产成人在线精品 | 日韩免费不卡视频 | 国产精品欧美一区二区三区不卡 | 欧美专区亚洲专区 | 久插视频 | 人人插超碰 | 免费男女网站 | 精品91在线 | 91福利视频免费观看 | 在线影院中文字幕 | 国产一区二区手机在线观看 | 精品国产乱码久久 | 天堂在线一区二区 | 亚洲综合成人婷婷小说 | 视频在线观看亚洲 | 欧美一级视频免费 | 亚洲精品一区二区18漫画 | 久久久香蕉视频 | 欧美美女一级片 | 国产 欧美 日本 | 在线观看免费国产小视频 | 91视频在线 | 日韩免费在线观看视频 | 久久99精品久久久久婷婷 | 成人在线中文字幕 | 亚洲专区欧美 | 97视频人人免费看 | 欧美在线观看小视频 | 久久高清视频免费 | 久久久999精品视频 国产美女免费观看 | 日本在线精品视频 | 国产黄影院色大全免费 | 男女视频国产 | 91精品999 | av电影不卡在线 | 国产精品 亚洲精品 | 日日日操| 在线成人短视频 | 久章草在线观看 | 我要看黄色一级片 | 97操碰 | 国产日韩精品在线观看 | 日日夜色 | 日批在线看 | 国产香蕉97碰碰碰视频在线观看 | 在线看片一区 | 色 免费观看 | 中文字幕一区二区三区四区 | 国产美女被啪进深处喷白浆视频 | 玖草在线观看 | 成人欧美一区二区三区黑人麻豆 | 久久99国产精品视频 | 亚洲va天堂va欧美ⅴa在线 | 国产精品麻豆果冻传媒在线播放 | 欧美一区二区三区免费看 | 国产小视频你懂的 | 日韩精品久久一区二区 | 久久久久久久亚洲精品 | 日韩有码网站 | 亚洲精品高清视频在线观看 | 国产精品国产三级国产aⅴ无密码 | 日韩欧美一区二区三区视频 | 久草在线免费资源站 | 黄色网大全 | 亚洲精品国产欧美在线观看 | 天天操天天爽天天干 | 黄色a大片 | 最近日韩中文字幕中文 | 精品日韩中文字幕 | 500部大龄熟乱视频 欧美日本三级 | 国产午夜麻豆影院在线观看 | 在线只有精品 | 69视频国产 | 国产在线va| 日韩乱理| 日韩狠狠操 | 亚洲成人免费在线 | 超碰人在线 | 99久久国产免费,99久久国产免费大片 | 激情久久小说 | 麻豆精品视频 | 亚洲91网站 | 国产剧情亚洲 | 美女视频黄色免费 | 精品二区视频 | av电影免费在线看 | 欧美日韩一区二区久久 | 免费在线电影网址大全 | 久草热视频| 国产91影院 | 日本中文字幕在线免费观看 | av福利在线 | 最新av在线网站 | 免费黄色特级片 | 国产精品99久久久久久久久久久久 | 久久一区二区三区超碰国产精品 | 丝袜制服综合网 | 欧美一级黄色片 | 日本h视频在线观看 | 中国一级片在线播放 | 五月亚洲综合 | 婷婷久久亚洲 | 欧美日韩色婷婷 | 亚洲一区欧美激情 | 免费久久99精品国产婷婷六月 | 欧美日韩性视频 | 国产一线天在线观看 | 久久综合婷婷国产二区高清 | 欧美最猛性xxxxx免费 | 视频一区二区精品 | 正在播放一区二区 | 国产精品美女久久久久久久久久久 | 久久免费视频这里只有精品 | 日韩av不卡在线观看 | 激情视频综合网 | av中文字幕av | 日韩在线免费观看视频 | 国产精品久久久久久久久久久不卡 | 91免费高清观看 | 国产一区自拍视频 | 在线观看黄色免费视频 | 五月激情综合婷婷 | 国产精品久久久精品 | 欧美夫妻性生活电影 | 天天操综合网 | 免费在线观看av网址 | 成人午夜性影院 | 日批在线观看 | 久久久高清| av日韩在线网站 | 九九久久精品 | 国产专区视频在线观看 | 亚洲高清在线视频 | 亚洲精品影院在线观看 | 美女久久视频 | 国产第一页在线播放 | 三级av在线| 色资源网在线观看 | 国产成人一二片 | 天天射天天干天天爽 | 国产免费又粗又猛又爽 | 中文字幕欲求不满 | 丁香资源影视免费观看 | 视频在线一区二区三区 | 国产97在线观看 | 六月婷婷久香在线视频 | 天天激情在线 | 欧美日韩免费观看一区=区三区 | 天天做日日做天天爽视频免费 | 99婷婷狠狠成为人免费视频 | 国产精品一区二区三区久久久 | 日日爱夜夜爱 | 日韩动态视频 | 精品国产日本 | 欧美日韩高清在线一区 | 亚洲 欧洲 国产 精品 | 亚洲国产精品久久 | 国产专区视频在线 | 久久国内精品视频 | 免费观看性生活大片 | 欧美人zozo | 三级小视频在线观看 | 久久视频这里有久久精品视频11 | 欧美少妇xxxxxx | 91在线视频精品 | 欧美在线你懂的 | 深爱激情亚洲 | 国产精品综合久久久久久 | 麻豆一精品传二传媒短视频 | 2021国产视频 | 欧美日韩国产免费视频 | 国产69精品久久久久99尤 | 欧美高清视频不卡网 | 97精品在线| 免费福利在线视频 | 亚洲日日日 | 日韩成人精品一区二区三区 | 日批网站在线观看 | 国产精品中文字幕在线播放 | 精品国精品自拍自在线 | 成年人在线看视频 | av电影一区二区三区 | 精品亚洲一区二区 | 97视频在线观看成人 | 日韩午夜在线播放 | 国产精品欧美一区二区三区不卡 | 色www. | 久久夜色精品国产欧美一区麻豆 | 婷婷综合影院 | 日韩欧美高清在线观看 | www.久久91| 欧美日在线观看 | 在线看av网址 | 四虎永久网站 | 亚洲第二色 | 国产视频在线播放 | 国产精品一区在线观看 | 啪啪小视频网站 | 蜜臀av夜夜澡人人爽人人 | 国产精品自拍av | www视频在线免费观看 | 波多野结衣在线播放一区 | 中文字幕电影网 | 日本精品小视频 | avwww在线| 国产精品99免费看 | 亚洲成人精品在线 | 日韩专区中文字幕 | 久久精品国产亚洲精品2020 | www.com黄| 欧美国产日韩在线观看 | 色在线观看网站 | 18+视频网站链接 | 亚洲成人黄色 | 国产码电影 | 久草在线在线精品观看 | 成年人在线看视频 | 99r在线| 国产一区二区手机在线观看 | 涩涩网站在线播放 | 免费色视频在线 | 女人魂免费观看 | 91精品国产一区 | 99免费在线 | 97精品国产97久久久久久粉红 | 国产成人l区 | 国产成人久久精品一区二区三区 | 亚洲婷久久 | 欧美成人xxxxx | 伊人五月综合 | 久久精品免费播放 | 久久成人人人人精品欧 | 五月天婷婷在线视频 | 色综合天天干 | 黄色com| 国产美女精品视频 | 中文不卡视频在线 | 99免费精品 | av免费福利| 精品一区二区三区四区在线 | 五月天中文在线 | 欧美在线一级片 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美精品v国产精品v日韩精品 | 日韩v在线 | 日韩国产欧美在线播放 | 中文字幕影片免费在线观看 | 91精品播放 | 久久中文字幕导航 | 免费电影一区二区三区 | 亚洲精品视频在线观看视频 | 久久综合久久综合这里只有精品 | 国内精品免费 | 成人av电影免费在线观看 | 91免费看片黄 | 国产精品美女久久久久久久网站 | 久草视频免费 | 成人 亚洲 欧美 | 欧美性一级观看 | 色综合天天做天天爱 | 国产高清在线视频 | 国产女v资源在线观看 | 中文av在线免费观看 | 日韩免费在线视频观看 | 亚洲精品色视频 | 美女久久久久久 | 色先锋av资源中文字幕 | 国内精自线一二区永久 | 欧美91精品久久久久国产性生爱 | 精品电影一区二区 | 狠狠久久伊人 | 国产免费黄色 | 日韩亚洲在线观看 | 日韩不卡高清 | 欧洲精品在线视频 | 欧美色插| 亚洲在线网址 | av免费片 | www.久草.com | 成人在线你懂得 | 在线亚洲人成电影网站色www | 国产精品高清在线 | 黄色网中文字幕 | 欧洲亚洲精品 | av一本久道久久波多野结衣 | 成人一级视频在线观看 | 一区二区三区免费播放 | 国产精品久久久久久久久久久久久久 | av在线免费观看网站 | 国产成人中文字幕 | 国产美女无遮挡永久免费 | 91精品91| 亚洲中字幕 | 久草在线视频网 | 五月天色婷婷丁香 | 国产中文字幕视频在线观看 | 天天草天天干天天 | 一区二区在线电影 | 欧美精品二 | 久久线视频 | 免费三及片 | 欧美精品久久久久久久免费 | www.av免费观看 | 狠狠干网站 | 亚洲做受高潮欧美裸体 | 日精品 | 亚洲成人精品影院 | 亚洲狠狠干 | 国产精品短视频 | 99久久精品免费看国产一区二区三区 | 婷婷在线五月 | 亚洲国产精品人久久电影 | 色婷婷国产精品 | av在线h| 超碰人人做 | 69视频国产 | 亚洲春色综合另类校园电影 | 久操中文字幕在线观看 | 在线免费视频你懂的 | 麻豆视频在线免费观看 | 久久手机免费观看 | 在线观看视频99 | 免费看色网站 | 亚洲视频大全 | 99久久影院 | 国产免费午夜 | 91精选 | 日韩视频中文字幕 | 久久爱992xxoo | 久久久www成人免费精品 | 99久久精品免费看国产 | 黄色影院在线免费观看 | 天天操天天射天天添 | 视频在线91 | 在线观看91精品国产网站 | 国产色综合天天综合网 | 国产精品video| 国产一级精品视频 | 在线观看国产一区 | 亚洲精品伦理在线 | 热re99久久精品国产66热 | 久久久久一区二区三区四区 | 操老逼免费视频 | 午夜影院日本 | 精品久久久久久国产91 | 三级毛片视频 | 国产精品日韩 | www激情com| 欧美精品中文在线免费观看 | 在线天堂中文www视软件 | 国产又粗又猛又爽又黄的视频先 | 久草在线免费资源 | 欧美激情精品久久久久 | 成人一级 | 成人免费中文字幕 | 久草在线99 | 欧美成人视 | 天天操天天操天天操天天操天天操 | 在线播放一区 | 国产亚洲精品中文字幕 | 久久电影中文字幕视频 | 亚洲精品午夜久久久 | 国产日产精品一区二区三区四区的观看方式 | 在线观看国产日韩欧美 | 国产99久久久欧美黑人 | 国产 欧美 日韩 | 天天色天天干天天色 | 91麻豆精品国产91久久久久久久久 | 最近高清中文在线字幕在线观看 | 狠狠干夜夜爱 | 公开超碰在线 | 国产在线播放观看 | 精品 一区 在线 | 黄色国产在线观看 | av片在线看| 免费黄色看片 | 爱av在线网 | av黄色免费在线观看 | 在线看一区二区 | www.av在线播放 | 久久97视频 | 高清av网站 | 欧美成人aa | 亚洲国产福利视频 | 久久人人插 | 久久久国产精品久久久 | 国产成人一区三区 | 91最新网址 | 免费a网站 | 天天想夜夜操 | 国产精品久久久久久久久久久久午夜 | 日韩网站免费观看 | 操操碰 | 欧美日韩亚洲精品在线 | 91成人看片| 99久热在线精品视频成人一区 | 婷婷色伊人 | 正在播放日韩 | 在线观看黄色大片 | 国产成人福利片 | 精品国产中文字幕 | 久草观看视频 | 日日夜夜噜 | 欧美精品一区二区性色 | 波多野结衣一区二区三区中文字幕 | 久久久.com| 久久国内精品99久久6app | 亚洲成人资源 | 国产一区国产精品 | 久久成年人网站 | 久久综合色综合88 | 久久国产影院 | www色片 | 国产亚洲观看 | 国产精品99蜜臀久久不卡二区 | 国产伦精品一区二区三区在线 | 午夜精品久久久久久久99无限制 | 久久成人精品电影 | 精品久久久久久久久亚洲 | 国产精品三级视频 | 97超碰在线资源 | 久久国产福利 | 久久99精品久久久久蜜臀 | 日韩av视屏在线观看 | 日本中文字幕电影在线免费观看 | 久草网在线| 亚洲精品动漫在线 | av在线永久免费观看 | 欧美视频一区二 | 国产日本在线播放 | 国产精品久久久久一区二区 | 一区二区三区在线看 | 国内精品免费久久影院 | 国产精品久久久久久久免费 | 久久久久视 | 三级毛片视频 | 日本韩国精品在线 | 九九热在线播放 | 国产粉嫩在线观看 | 在线看毛片网站 | 亚洲精品国产成人av在线 | 日日操夜| 欧洲亚洲国产视频 | 国产综合在线视频 | 欧美精品九九 | 中文字幕日韩免费视频 | 亚洲视频在线视频 | 日韩免费视频 | 久久综合色天天久久综合图片 | 在线性视频日韩欧美 | 国产成人在线观看免费 | 激情综合网色播五月 | 亚洲黄色一级电影 | 不卡的av在线播放 | 果冻av在线| 成人黄色毛片 | 日韩高清一| 91麻豆精品国产91久久久无需广告 | a视频在线观看免费 | japanesefreesex中国少妇 | 日韩精品国产一区 | 最近日本韩国中文字幕 | 国产精品久久久久久久久久免费看 | 亚洲成a人片在线www | www婷婷| 日本中文字幕在线观看 | 日本中文字幕影院 | 久久综合九色综合久99 | 成人夜晚看av | 看国产黄色片 | 网站在线观看日韩 | 午夜视频在线观看欧美 | 91视频在线免费观看 | 久久99亚洲网美利坚合众国 | 亚洲国产中文在线 | 国产日产精品一区二区三区四区的观看方式 | 欧美日韩高清国产 | 97国产小视频 | 99精品国自产在线 | 91精品视频免费看 | 麻豆国产在线播放 | 日韩av中文字幕在线 | 亚洲性少妇性猛交wwww乱大交 | 精品超碰 | www.五月天婷婷 | 亚洲综合色激情五月 | 欧美色综合天天久久综合精品 | 网站在线观看你们懂的 | 亚洲激情 欧美激情 | 97在线观看 | 久久综合成人网 | 精品一区二区久久久久久久网站 | 久久天天躁夜夜躁狠狠85麻豆 | 天天干天天操av | 99久视频 | 欧美一级激情 | 91成人免费 | 色综合久久久久综合 | 成人黄色免费观看 | 亚洲性少妇性猛交wwww乱大交 | 日韩电影精品 | 国产精品毛片一区二区在线看 | 日韩在线视频网站 | 美女精品 | 亚洲天天在线日亚洲洲精 | 黄色aa久久 | 中文字幕免费成人 | 免费色婷婷 | 在线成人欧美 | 福利一区在线 | 一区二区视频播放 | 99精品国产高清在线观看 | 在线免费精品视频 | 97**国产露脸精品国产 | 国产一二三四在线视频 | 欧美性护士 | 99中文在线 | 婷婷色资源 | 国产高清小视频 | 美女国内精品自产拍在线播放 | 亚洲精品五月天 | 日韩影片在线观看 | 久久国产精品免费视频 | 国产伦精品一区二区三区照片91 | 91天堂素人约啪 | 精品国产一区二区三区久久久蜜臀 | 中国老女人日b | 成人小电影在线看 | 婷婷九九 | 99精品久久久久久久 | 天天天操操操 | 中文字幕乱在线伦视频中文字幕乱码在线 | 成人蜜桃 | 婷婷5月激情5月 | 欧美日韩免费在线观看视频 | 国产亚洲精品久久久久动 | 国产高清免费 | 日韩高清免费电影 | www.天天操.com | 黄色a一级片 | 人人爽人人插 | 五月天激情综合网 | 国产精品美女久久久网av | 色综合天天射 | 国产日女人 | 欧美视频日韩视频 | 久久久久久久久久福利 | 亚洲综合精品视频 | 精品成人网| 99r在线 | 91精品国产91久久久久 | 久久精品国产第一区二区三区 | 免费国产视频 | 欧美精品一区二区三区一线天视频 | 亚洲精区二区三区四区麻豆 | 91看片在线看片 | 天天干天天做天天操 | 亚洲精品国产品国语在线 | 激情深爱 | 亚洲精品播放 | 国产一级免费播放 | 国产伦理一区二区三区 | 美女视频永久黄网站免费观看国产 | 激情婷婷网 | 亚洲精品小区久久久久久 | 色中色综合 | 免费视频二区 | 中文字幕亚洲字幕 | 91中文在线观看 | 丁香花在线视频观看免费 | 在线观看一区二区视频 | 粉嫩av一区二区三区四区五区 | 精久久久久 | 国产一区电影在线观看 | 色欧美综合 | 正在播放一区二区 | 中文字幕在线观看视频网站 | 欧美成人在线网站 | 91精品免费看 | 91精品国产99久久久久 | 中文字幕av电影下载 | 成人在线视频你懂的 | 91麻豆精品国产自产在线游戏 | av久久久久久 | 天天躁日日躁狠狠躁av中文 | 中文字幕在线看视频国产中文版 | 99精品国产99久久久久久福利 | 天天射天天干 | 久久久男人的天堂 | 九九av| 福利一区在线 | 亚洲三级网| 欧美亚洲一区二区在线 | 在线观看91精品国产网站 | 激情中文字幕 | 色五婷婷 | 日韩视频一区二区三区在线播放免费观看 | 亚洲精品一区二区久 | 天天爽人人爽 | 久久精彩视频 | 激情综合站| 四月婷婷在线观看 | 久久综合久久久久88 | 精品av网站| 国产一级片直播 | 精品特级毛片 | 欧美色综合| 欧美性生爱 | 中文字幕精品一区二区精品 | 成人在线免费av | 美女搞黄国产视频网站 | 三级av片| 欧美日本三级 | 天天操天天添天天吹 | 视频二区在线 | 视频在线观看一区 | 成人a v视频| 9999毛片| 91热精品 | 综合久久网站 | 一区二区视频欧美 | 亚洲成年人在线播放 | 亚洲国产精品电影在线观看 | 九九视频免费在线观看 | 99视频在线精品国自产拍免费观看 | 午夜精品久久一牛影视 | 国产成人精品久久久 | 麻豆视频一区二区 | 五月天婷婷狠狠 | 午夜av电影 | 91精品国产欧美一区二区 | 黄色一二级片 | 国产亚洲免费的视频看 | 国产精品欧美日韩 | 在线免费观看成人 | 国产精品久久一区二区无卡 | 日本在线观看黄色 | 久久黄色片 | 久久久精品国产一区二区 | 一区精品在线 | 麻豆传媒视频在线播放 | 网站在线观看日韩 | 天天色天天射天天综合网 | 97操碰| 国产精品免费视频网站 | 午夜在线看 | 国产麻豆精品免费视频 | av色综合网 | 国产成人精品一区二区三区福利 | 国产五月色婷婷六月丁香视频 | 最新av网址在线观看 | 欧美日韩综合在线观看 | 日韩av视屏在线观看 | 久久夜色精品国产欧美乱极品 | 丰满少妇一级 | 久草在线免费新视频 | 亚洲二级片| 国产精品综合av一区二区国产馆 | 一区二区欧美日韩 | 丁香婷婷综合色啪 | 亚洲区色| 精品视频在线看 | 亚洲国产中文字幕在线观看 | 色综合久久66 | 麻豆国产在线视频 | 久久精品国产精品亚洲精品 | 2000xxx影视 | 天天干天天干天天射 | 91成人小视频 | 色婷婷综合久久久久中文字幕1 | 久久99国产精品久久99 | 91av社区| 久久社区视频 | 免费看日韩 | 亚洲专区 国产精品 | 久久免费播放视频 | 久久99精品国产麻豆婷婷 | 欧美一级电影在线观看 | 亚洲乱码在线观看 | 久久久久久黄 | 国产成人免费网站 | av在线网站观看 | 97在线免费观看视频 | www.久热| 久久久久久久久久久高潮一区二区 | 最新av网站在线观看 | 五月天激情开心 | 超碰公开97| 麻豆一二 | 国产色婷婷在线 | 国产精品二区在线 | 深爱激情av | 久久线视频 | 韩国av一区二区 | 成年人在线观看视频免费 | 亚洲一级片免费观看 | 91视频免费网站 | 婷婷久久五月天 | 天堂va欧美va亚洲va老司机 | 国产精品久久久久一区二区国产 | 97国产小视频 | 麻豆系列在线观看 | 久久大视频 | 亚洲一二三区精品 | 久国产在线播放 | 国产精品久久网站 | 欧美激情视频在线观看免费 | 天天干夜夜爱 | 999视频精品 | 狠狠色丁香婷婷综合久久片 | 丁香婷婷久久 | av电影av在线 | 黄色小说网站在线 | 国产在线观看你懂得 | 少妇按摩av | 久久亚洲免费视频 | 日韩精品一区二区三区在线播放 | 免费人成网ww44kk44 | 亚洲精品五月 | 久久全国免费视频 | 国产视频97 | 免费av网址大全 | 不卡电影免费在线播放一区 | 免费中午字幕无吗 | 国产精品久久久久婷婷二区次 | 亚洲婷婷在线视频 | 免费看成人a | 激情五月婷婷激情 | 精品无人国产偷自产在线 | aaa日本高清在线播放免费观看 | 中文字幕一区av | 久久精品国产亚洲精品 | 人人干人人艹 | 91天天操| 久久久男人的天堂 | 午夜久久久精品 | 成年人在线免费看视频 | 国产剧情在线一区 | 永久免费观看视频 | 一区二区激情 | 91夫妻自拍 | 国产黑丝一区二区 | 久久久久久蜜桃一区二区 | 国产精品在线看 | 日韩在线观| 日韩在线观看小视频 | 最新色站 | 亚洲精品99久久久久中文字幕 | www.夜色321.com | 99r在线视频 | 亚洲成人资源在线观看 | 国产精品福利在线 | 99色视频在线| 粉嫩一区二区三区粉嫩91 | 亚洲欧美成人网 | 久久视精品 | 精品国产美女 | 午夜视频在线观看一区二区三区 | 免费在线观看一区二区三区 | 久久你懂得 | 亚洲乱码中文字幕综合 | 国产精品99久久99久久久二8 | 精品久久久亚洲 | 麻豆久久精品 | www.久久久.com| 亚洲婷婷网 | 久久久久久国产精品999 | 日本在线观看一区二区 | 精品国内| 亚洲欧洲精品久久 | 黄色a视频免费 | 成人亚洲精品久久久久 | av免费在线播放 | 中文字幕色播 | 国产亚洲精品美女久久 | 中文字幕视频播放 | 欧美日韩免费一区二区 | 婷婷丁香花 | japanesexxxhd奶水 国产一区二区在线免费观看 | 精品99在线观看 | 亚洲欧美精品一区二区 | 日韩色区 | 在线观看视频黄色 | 国产人成一区二区三区影院 | 中文资源在线播放 | 亚洲1区在线 | 99久久99久久精品 | 亚洲精品美女免费 | 国产亚洲成人网 | 国产成人av免费在线观看 | 美女黄频免费 | 五月激情亚洲 | 操操综合 | 操操碰 | 久久99国产精品二区护士 | 97国产大学生情侣酒店的特点 | 日日夜夜骑 | 视频在线国产 | 亚洲日本va中文字幕 | 狠狠色伊人亚洲综合网站色 | 在线看片一区 | 成人在线视频免费 | 精品国模一区二区三区 | 中文字幕在线视频国产 | 国产欧美在线一区 | 亚洲精品国偷拍自产在线观看蜜桃 | 伊人春色电影网 | 色香网 | 日韩r级在线 | 国产一区二区综合 | 在线看国产精品 | 欧美成人黄色 | 国产精品毛片一区视频 | 蜜臀91丨九色丨蝌蚪老版 | 国产精品精| 超碰97人人在线 | 少妇av网| 国产美女免费观看 | 美女黄频视频大全 | 亚洲人成免费 | 久久免费电影网 | 国产一区在线免费 | 色爽网站| 日韩视频免费观看高清完整版在线 | 国产欧美日韩一区 | 奇米网网址| 五月天婷婷丁香花 | 国产精品久久久久免费 | 黄色资源网站 | 国产黄色成人av | 亚洲三级精品 | 国产成人精品综合 | 丁香花在线视频观看免费 | 久久最新视频 | 99在线国产 | 国产一区二区三区免费观看视频 | 99视频+国产日韩欧美 | 狠狠色丁香久久婷婷综合丁香 | 天天爱天天射天天干天天 | 91视频com| 三级小视频在线观看 | 欧美日韩国产精品一区 | 五月天久久婷 | 在线观看视频 | 欧美日韩一区二区三区不卡 | 日韩国产在线观看 | 粉嫩高清一区二区三区 | 成人免费在线观看av | 在线观看亚洲视频 | 综合色伊人 | 久久在线精品 | 久久伊人操 | 国产精品久久久久一区二区三区共 | 日本在线观看中文字幕 | 不卡的av电影 | 日本久久成人 | 天天摸天天操天天爽 | 伊人伊成久久人综合网小说 | 久久草精品 | 激情av在线播放 | 国产福利一区在线观看 | 91爱爱电影 | 狠狠躁日日躁狂躁夜夜躁av | 免费久久网站 | 国产精品美女久久久久久免费 | 成人精品视频 | 亚州精品在线视频 | 国产精品99蜜臀久久不卡二区 | 亚洲视频资源在线 | 国产91精品欧美 | 国产精品第一页在线观看 | 婷婷综合国产 | 久久久久久综合 | 国产精品久久久久久久久费观看 | 麻豆影视在线观看 | 国产 视频 高清 免费 | 日韩在线欧美在线 | 色999五月色 | 午夜精品一二区 | 久久久久国产一区二区三区 | 久久国产精品免费观看 | 免费黄色网址网站 | 久草视频中文在线 | 欧美日韩国产一区二区三区 | 伊人春色电影网 | 手机在线免费av | 五月婷婷激情网 | 在线观看一二三区 | 欧美天天综合 | 在线免费观看av网站 | freejavvideo日本免费 | 成人免费在线观看入口 | 极品久久久 | 九九色网 | 免费看污黄网站 | 国产精品一区二区三区在线看 | 欧美一区免费观看 | 婷婷久久久 | 亚洲精品女人 | 国产精品岛国久久久久久久久红粉 | 特级西西444www高清大视频 | 九九久久久久99精品 | 欧美 日韩 国产 中文字幕 | 一级精品视频在线观看宜春院 | 日韩精品专区 | 国产精品综合久久久 | а天堂中文最新一区二区三区 | 日本性高潮视频 | 中文字幕日韩在线播放 | 国产视频一区在线免费观看 | 99精品久久精品一区二区 | 久久免费精彩视频 | 亚洲综合在线五月天 | 欧美一级淫片videoshd | 国产一区二区久久久久 | 久久精品123 | 亚洲精品综合在线观看 | 全久久久久久久久久久电影 | 欧美韩日精品 | 国产女教师精品久久av | 色婷婷成人网 | 最新中文在线视频 | 国产正在播放 | 中文字幕在线观看资源 | 久久久久北条麻妃免费看 | 国产色网 | 丁香婷婷综合网 | 国产91精品高清一区二区三区 | 精品极品在线 | 探花视频在线观看 | 久艹在线免费观看 | 久草手机视频 | 午夜少妇av | 人人爽人人射 | 欧美性生交大片免网 | 97在线看| av高清一区| 免费在线观看视频一区 | 在线观看久 | 久久久这里有精品 | 色综合综合 | 成人av久久| 色婷婷成人 | 99精品在线视频播放 | 久久天堂亚洲 | 菠萝菠萝在线精品视频 | 亚洲成人黄色网址 | 日韩av电影中文字幕在线观看 | 永久免费精品视频 | 成年人在线播放视频 | 超碰人人草 | 热久久国产 | 国产精品乱码久久久久 | 久久久久久久久久久久电影 | 久久人人爽人人爽 | 国产精品久久久久国产精品日日 | 91麻豆精品国产 | 天天摸天天操天天爽 | 久草在线在线视频 | 国产美女网站视频 | 成人一区二区三区在线 | 激情五月亚洲 | 国产精品 日本 | 久草亚洲视频 | 亚洲激情六月 | 在线观看黄网站 | 成全免费观看视频 | 天天做日日做天天爽视频免费 | 国产成人三级三级三级97 | 国产精品久久久久高潮 | 欧美成人手机版 | 91精品视频免费看 | 福利一区在线视频 | 91精品91| 综合铜03| 国产一区二区中文字幕 | 亚洲精品男人的天堂 | 久草在线中文视频 | 成人wwwxxx视频| 久久久久观看 | 91在线九色 | 亚洲经典视频在线观看 | 亚洲免费av片 | 精品久久久久久久久久久久 | 亚洲二区精品 | 中文字幕黄色网址 | 亚洲精品美女视频 | 国产精品免费久久久久影院仙踪林 | 中文字幕二区在线观看 | 中文字幕第|