句容建設(shè)路幼兒園網(wǎng)站鄭州高端網(wǎng)站建設(shè)哪家好
文章目錄
- STL基本概念
- 使用STL的好處
- 容器
- vector
- 1.vector容器簡(jiǎn)介
- 2.vector對(duì)象的默認(rèn)構(gòu)造函數(shù)
- 3.vector對(duì)象的帶參構(gòu)造函數(shù)
- 4.vector的賦值
- 5.vector的大小
- 6.vector容器的訪問(wèn)方式
- 7.vector的插入
STL基本概念
- STL(Standard Template Library,標(biāo)準(zhǔn)模板庫(kù))
- STL 從廣義上分為: 容器(container) 算法(algorithm) 迭代器(iterator)
- 迭代器:算法通過(guò)迭代器訪問(wèn)容器里面的數(shù)據(jù)
- 容器和算法之間通過(guò)迭代器進(jìn)行無(wú)縫連接。
- STL 幾乎所有的代碼都采用了模板類或者模板函數(shù),這相比于傳統(tǒng)的由函數(shù)和類組成的庫(kù)來(lái)說(shuō)提供了更好的代碼重用機(jī)會(huì)
使用STL的好處
- STL是C++的一部分,因此不需要額外安裝什么,被內(nèi)建在你的編譯器里面
- STL的一個(gè)重要特點(diǎn)是將數(shù)據(jù)結(jié)構(gòu)和算法分離
- 程序員不用思考STL的實(shí)現(xiàn)過(guò)程
- STL具有高可用性,高性能,高移植,跨平臺(tái)優(yōu)點(diǎn)
容器
序列式容器:
- 序列式容器每個(gè)元素都有固定位置–取決于插入的時(shí)機(jī)和地點(diǎn),和元素值無(wú)關(guān)。
- vector,deque、list、stack、queue
關(guān)聯(lián)式容器:
- 元素位置取決于特定的排序準(zhǔn)則,和插入順序無(wú)關(guān)
- set、multiset、map、multimap
vector
1.vector容器簡(jiǎn)介
- 尾部插入速度比較快
- vector是將元素置于一個(gè)動(dòng)態(tài)數(shù)組中加以管理的容器
- vector可以隨機(jī)存取元素(支持索引值直接存取)
- vector尾部添加或移除元素的速度非??焖?#xff0c;但是在頭部插入或移除元素比較費(fèi)時(shí)
2.vector對(duì)象的默認(rèn)構(gòu)造函數(shù)
vector<class T>vecT;
vector<int>vecInt;
vector<float>vecFloat;
vector<string>vecString;class A{};
vector<A>vecA; //用于存放CA對(duì)象的vector容器,
//由于容器元素的存放是按值復(fù)制的方式進(jìn)行,所以此時(shí)CA必須提供CA的拷貝構(gòu)造函數(shù),以保證CA對(duì)象間拷貝正常vector<A*>vecpA; //用于存放CA對(duì)象指針的vector容器
3.vector對(duì)象的帶參構(gòu)造函數(shù)
理論知識(shí):
- vector(beg,end); //構(gòu)造函數(shù)將[beg,end)區(qū)間中的元素拷貝給本身,注意該區(qū)間左閉右開
- vector(n,elem);//構(gòu)造函數(shù)將n個(gè)elem拷貝給本身
- vector(const vector& vec); //拷貝構(gòu)造函數(shù)
int main()
{int arr[] = { 1,2,3,4,5 }; //用兩個(gè)指針構(gòu)造vector<int>v1(arr, arr + 5);vector<int>v2(3, 10);//存儲(chǔ)3個(gè)10for (int i = 0; i < v2.size(); i++){cout << v2[i] << " ";}cout << endl;vector<int>v3(v1);//用一個(gè)已經(jīng)構(gòu)造好的對(duì)象初始化新的對(duì)象for (int i = 0; i < v1.size(); i++){cout << v3[i] << " ";}
}
4.vector的賦值
- vector.assign(beg,end);//將[beg,end)區(qū)間中的元素拷貝賦值給本身,注意該區(qū)間左閉右開
- vector.assign(n,elem);//將n個(gè)elem拷貝賦值給本身
- vector& operator=(const vector& vec);//重載等號(hào)操作符
- vector.swap(vec); //將vec與本身的元素互換
int main()
{vector<int>vecIntA(3, 10);vector<int> vecIntB, vecIntC, vecIntD;int iarray[] = { 0,1,2,3,4 };//將數(shù)組iarray中的所有元素賦值給vactorIntA容器vecIntA.assign(iarray, iarray + 5);cout << "A:";for (int i = 0; i < vecIntA.size(); i++){cout <<vecIntA[i] << " ";}cout << endl;//將vecIntA中所有元素賦值給vecIntBvecIntB.assign(vecIntA.begin(), vecIntA.end());cout << "B1:";for (int i = 0; i < vecIntB.size(); i++){cout <<vecIntB[i] << " ";}cout << endl;cout << "B2:";vecIntB.assign(vecIntA.begin()+2, vecIntA.end()-1);for (int i = 0; i < vecIntB.size(); i++){cout << vecIntB[i] << " ";}cout << endl;//將4個(gè)10拷貝到vecIntCvecIntC.assign(4, 10);cout << "C:";for (int i = 0; i < vecIntC.size(); i++){cout<< vecIntC[i] << " ";}cout << endl;//互換元素vecIntB.swap(vecIntC);cout << "B2:";for (int i = 0; i < vecIntB.size(); i++){cout <<vecIntB[i] << " ";}cout << endl;cout << "C:";for (int i = 0; i < vecIntC.size(); i++){cout << vecIntC[i] << " ";}cout << endl;//重載賦值運(yùn)算符vecIntD = vecIntC;cout << "D:";for (int i = 0; i < vecIntD.size(); i++){cout << vecIntD[i] << " ";}return 0;
}
5.vector的大小
- vector.size(); //返回容器中元素的個(gè)數(shù)
- vector.empty(); //判斷容器是否為空
- vector.resize(); //重新指定容器的長(zhǎng)度為num,若容器變長(zhǎng),則以默認(rèn)值填充新位置。如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除
- vector.resize(num,elem);//重新指定容器的長(zhǎng)度為num,若容器變長(zhǎng),則以elem填充新位置。如果容器變短,則末尾超出容器長(zhǎng)度的元素被刪除
int main()
{vector<int>v1;cout << "v1.size: " <<v1.size()<< endl;if (v1.empty()) //判斷容器是否為空{cout << "v1 is empty" << endl;}int array[] = { 1,2,3,4,5 };v1.assign(array, array + 5);//將容器的長(zhǎng)度變長(zhǎng)v1.resize(10);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//將容器長(zhǎng)度變短v1.resize(3);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//將容器長(zhǎng)度變長(zhǎng),并且擴(kuò)展出來(lái)的新的元素為指定的值v1.resize(10, 100);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;return 0;
}
6.vector容器的訪問(wèn)方式
- vec.at[idx]; //返回索引idx所指數(shù)據(jù),如果idx越界,拋出out_of_range異常
- vec[idx]; //返回索引idx所指的數(shù)據(jù),越界時(shí),運(yùn)行直接報(bào)錯(cuò)
7.vector的插入
- 在vector末尾進(jìn)行插入:push_back、在末尾刪除元素:pop_back
- vector.insert(pos,elem); //在pos位置插入一個(gè)elem元素的拷貝,返回新數(shù)據(jù)的位置
- vector.insert(pos,n,elem);//在pos位置插入n個(gè)elem數(shù)據(jù),無(wú)返回值
- vector.insert(pos,beg,end); //在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無(wú)返回值
int main()
{int arr[] = { 1,2,3,4,5 };vector<int>v1(arr, arr + 5);//在末尾插入函數(shù)v1.push_back(10);//在末尾刪除函數(shù)v1.pop_back();//在指定位置插入一個(gè)指定元素v1.insert(v1.begin()+3,100); //注意第一個(gè)參數(shù)不能為下標(biāo),應(yīng)該為指針for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//在指定的位置插入多個(gè)元素v1.insert(v1.begin() + 3, 3, 1000);//在下標(biāo)為3的位置上插入3個(gè)1000for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//將指定的區(qū)間中的元素插入到指定的位置上,將50—80插入int b[] = { 40,50,60,70,80,90 };v1.insert(v1.begin() + 7, b + 1, b + 5);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;
}