C++?基礎(chǔ)函數(shù)的介紹及使用(Vector+deque+STL)
一、Vector的基礎(chǔ)函數(shù)
之前有學(xué)習(xí)過 vector、set、map等容器,都是需要什么搜什么,沒有詳細(xì)的了解其中的內(nèi)容。最近在看 STL 的相關(guān)內(nèi)容,就順手整理一些基礎(chǔ)性內(nèi)容,避免以后遇到的時(shí)候再臨時(shí)抱佛腳。
1. 構(gòu)造函數(shù)
vector<T> v; ? ? //創(chuàng)建一個(gè)空的vector vector<T> v(int nSize, const t& t); ? ? //創(chuàng)建一個(gè)vector,元素個(gè)數(shù)為nSize,元素值均為t vector<T> v(int nSize); ? ? //創(chuàng)建一個(gè)vector,元素個(gè)數(shù)為nSize vector<T> v(const vector&); ? ? //復(fù)制構(gòu)造函數(shù) vector<T> v = vector(begin,end); ? ? //復(fù)制[begin,end]范圍內(nèi)另一個(gè)數(shù)組的元素到 v中
2. 增加元素
v.push_back(const T& x); ? ? //在vector尾部增加一個(gè)元素x v.insert(iterator it, const T& x); ? ? //在vector中迭代器指向的元素前插入一個(gè)元素x v.insert(iterator it, int n,const T& x); ? ? //在vector中迭代器指向的元素前插入n個(gè)相同的元素x v.insert(iterator it,const_iterator first,const_iterator last); ? ? //在vector中迭代器指向的元素前插入另一個(gè)相同類型vector中[first,last]間的元素
3. 刪除元素
v.erase(iterator it); ? ? //刪除vector中迭代器指向的元素 v.erase(iterator first, iterator last); ? ? //刪除vector中[first,last)的元素 v.pop_back(); ? ? //刪除vector中的最后一個(gè)元素 v.clear(); ? ? //清空向量中的所有元素
4. 遍歷vector
v.at(int nPos); ? ? //返回nPos位置元素 v.front(); ? ? //返回vector的首元素 v.back(); ? ? //返回vector的尾元素 v.begin(); ? ? //返回指向第一個(gè)元素的迭代器 v.end(); ? ? //返回指向最后一個(gè)元素下一位置的迭代器 v.rbegin(); ? ? //反向迭代器,指向最后一個(gè)元素 v.rend(); ? ? //反向迭代器,指向第一個(gè)元素的前一個(gè)位置
5. 判斷函數(shù)
v.empty(); ? ? //判斷vector是否為空
6. 大小函數(shù)
v.size(); ? ? //返回vector中元素個(gè)數(shù) v.capacity(); ? ? //返回當(dāng)前vector中所能容納的最大元素個(gè)數(shù) v.max_size(); ? ? //返回當(dāng)前vector最大可允許的元素?cái)?shù)量個(gè)數(shù)
7. 其他函數(shù)
v.swap(vector& v2); ? ? //交換兩個(gè)同類型的vector v.assign(int n,const T& t); ? ? //設(shè)置vector中第n個(gè)元素的值為t v.assign(const_iterator first,const_iterator last); ? ? //vector中[first,last)中的元素設(shè)置成當(dāng)前vector元素
二、deque的介紹及使用
deque(double ended queue) 作為雙端隊(duì)列,不論在尾部或頭部插入元素,都十分便捷。而在中間插入元素會(huì)比較費(fèi)時(shí),因?yàn)楸仨氁苿?dòng)中間其他的元素。
雙端隊(duì)列是一種隨機(jī)訪問的數(shù)據(jù)類型,提供了在序列兩端快速插入和刪除的功能,它可以在需要的時(shí)候改變自身大小,完成了標(biāo)準(zhǔn) C++ 數(shù)據(jù)結(jié)構(gòu)中隊(duì)列的所有功能。
三、deque 和 vector的差別
- deque 則是一種雙向開口的連續(xù)線性空間,vector是單向開口的連續(xù)線性空間。
- deque 對象在隊(duì)列的兩端插入和刪除元素比較高效,vector 在序列末尾插入和刪除元素比較高效。
- deque 允許在常數(shù)時(shí)間內(nèi)在序列頭部進(jìn)行元素的插入和刪除操作,并且 deque 沒有所有的 capacity() 觀念,它是動(dòng)態(tài)地以分段連續(xù)空間組合而成,隨時(shí)可以增加一段新的空間并鏈接起來。vector會(huì)因舊空間不足而重新配置一塊更大空間,然后復(fù)制元素,再釋放舊空間,即空間預(yù)留機(jī)制。
雖然 deque 也提供 Random Access Iterator,但它的迭代器并不是普通的指針,復(fù)雜度較高。因此除非必要,應(yīng)盡可能選擇使用 vector 而非 deque。對 deque 的排序操作,可以先完整復(fù)制到一個(gè) vector 中,使用 STL 中的排序操作對 vector 排序后,再復(fù)制回 deque。
deque 通常由一些獨(dú)立的區(qū)塊組成,第一個(gè)區(qū)塊朝某方向擴(kuò)展,最后一個(gè)區(qū)塊朝另一方向擴(kuò)展。它允許較為快速地隨機(jī)訪問,但不像 vector 一樣把所有對象保存在一個(gè)連續(xù)的內(nèi)存塊,而是多個(gè)連續(xù)的內(nèi)存塊,并且在一個(gè)映射結(jié)構(gòu)中保存對這些塊以及順序的跟蹤。
1、構(gòu)造函數(shù)
#include<deque> deque<type> deq; ? ? ? ? ? ?//聲明一個(gè)元素類型為 type 的雙端隊(duì)列 deq deque<type> deq(nSize); ? ? ? ? ? ?//聲明含有 nSize 個(gè)默認(rèn)初始化元素的 deq deque<type> deq(nSize, value) ? ? ? ? ? ?//聲明含有 nSize 個(gè)值為 value 的元素的deq deque<type> deq(MyDeque); ? ? ? ? ? ?//復(fù)制MyDeque到deq deque<type> deq(first, last); ? ? ? ? ? ?//使用迭代器first,last范圍內(nèi)的元素初始化deq
2、常用成員函數(shù)
deq[nPos]; ? ? ? ? ? ?//訪問雙向序列中 nPos 位置上的元素 deq.front(); ? ? ? ? ? ?//返回第一個(gè)元素 deq.back(); ? ? ? ? ? ?//返回最后一個(gè)元素 deq.push_front(x); ? ? ? ? ? ?//把元素 x 插入到 deq 的頭部 deq.pop_front(); ? ? ? ? ? ?//彈出 deq 的第一個(gè)元素 deq.push_back(x); ? ? ? ? ? ?//把元素 x 插入到 deq 的尾部 deq.pop_back(); ? ? ? ? ? ?//彈出 deq 的最后一個(gè)元素
3、特點(diǎn)
- 支持使用 [] 和 at() 進(jìn)行隨機(jī)訪問,但性能沒有 vector 好;
- 可以在內(nèi)部進(jìn)行插入和刪除操作,但性能沒有 list 好;
- deque 的元素存取和迭代器操作會(huì)稍微較慢,因?yàn)閮?nèi)部結(jié)構(gòu)中多一個(gè)間接過程;
- deque 的迭代器是一種特殊的智能指針,能夠在不同區(qū)塊之間跳轉(zhuǎn);
- deque 不支持對容量和內(nèi)存分配時(shí)機(jī)的控制。
- deque 的內(nèi)存重分配優(yōu)于 vector,因?yàn)槠鋬?nèi)部不需要復(fù)制所有元素。
- deque 的內(nèi)存塊不再被使用時(shí),會(huì)被釋放。但是該機(jī)制由實(shí)際操作版本控制是否執(zhí)行。
四、STL中容器的通用操作函數(shù)
最近在學(xué)習(xí) C++ 中 STL 標(biāo)準(zhǔn)庫中的東西,關(guān)于list、vector、deque、set、map等容器的操作函數(shù)中存在一些通用函數(shù),整理出來一起學(xué)習(xí)。
1. 構(gòu)造函數(shù)
ContType<T> C; ? ? ? ? ? ?//創(chuàng)建一個(gè)空容器 ContType<T> C(nSIze); ? ? ? ?//創(chuàng)建一個(gè)含有 nSize 個(gè)默認(rèn)元素的容器 ContType<T> C(nSize, Value); ? ?//創(chuàng)建一個(gè)含有 nSize 個(gè)值為 Value 的元素的容器 ContType<T> C1(C2); ?//復(fù)制一個(gè)同類型容器 ContType<T> C(first, last); ? ? ?//復(fù)制[first,last)范圍內(nèi)的元素到新容器中 C.~ContType(); ? ? ? ? ? ?//刪除所有元素,釋放內(nèi)存
2. 判斷函數(shù)
C.empty(); ? ? ? ? ? ?//判斷容器是否為空 C1==C2; ? ? ? ? ? ?//判斷c1是否等于c2
3. 訪問函數(shù)
lst.get_allocator(); ? ? ? ?//返回容器的內(nèi)存模型 C.begin(); ? ? ? ?//正向迭代器,指向第一個(gè)元素 C.end(); ? ? ? ? //正向迭代器,指向最后一個(gè)元素的下一位置 C.rbegin(); ? ? //反向迭代器,指向最后一個(gè)元素 C.rend(); ? ? ?//反向迭代器,指向第一個(gè)元素的前一個(gè)位置 C.size(); ? ? ?//返回容器當(dāng)前存儲(chǔ)的元素?cái)?shù)量 C.max_size(); ?//返回容器能容納的最大元素?cái)?shù)量
4. 賦值函數(shù)
C1=C2;//將c2的值賦給c1 //swap()交換函數(shù) C1.swap(C2);//交換c1和c2的數(shù)據(jù) Swap(C1,C2);//同上 //assign()賦值函數(shù) C.assign(size_type nSize, const_type Value); ? ? ? ?//將list中元素替換為 nSize 個(gè)值為 Value 的元素 C.assign(iterator first,iterator last); ? ? ? ?//將[first,last)中的元素復(fù)制到當(dāng)前容器中 C.assign(ContType<T> &C2); ? ? ? ? ? //將另一個(gè)容器中的元素復(fù)制到當(dāng)前容器中
5. 操作函數(shù)
C.clear();//清空容器 //insert()插入元素 C.insert(iterator iter, const_type Value);//在 iter 指向的位置插入值為 Value的元素 C.insert(iterator iter,size_type num, const_type &Value);//在 iter 指向的位置插入 num 個(gè)值為 Value的元素 C.insert(iterator iter,iterator fisrt,last);//在 iter 指向的位置插入[first,end)區(qū)間內(nèi)的所有元素 //erase()刪除元素 C.erase(nPos,nSize);//刪除從下標(biāo) nPos 開始的 nSize 個(gè)元素 C.erase(iterstor iter);//刪除該迭代器指向的元素 C.erase(iterator first,iterator lase);//刪除[first,last)區(qū)間的元素 //vector、deque、list C.front(); ? ? ? ?//返回第一個(gè)元素 C.back(); ? ? ? ?//返回最后一個(gè)元素 C.resize(); ? ? ? ?//改變list的大小 //deque、list C.pop_front(); ? ? ? ?//刪除第一個(gè)元素 C.push_front(Value); ? ? ? ?//在容器頭部添加一個(gè)元素Value //vector、deque、list C.front(); ? ? ? ? ? ? ? //返回第一個(gè)元素 C.back(); ? ? ? ? ? ? ? //返回最后一個(gè)元素 C.resize(); ? ? ? ? ? ? //改變list的大小 C.pop_back(); ? ? ? ? ? //刪除最后一個(gè)元素 C.push_back(Value); ? ? //在容器末尾添加一個(gè)元素Value //vector、list C.reverse(); ? ? ? ?//把list中的元素反轉(zhuǎn)
到此這篇關(guān)于C++ 基礎(chǔ)函數(shù)的介紹及使用(Vector+deque)的文章就介紹到這了,更多相關(guān)C++ deque Vector內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt結(jié)合libqrencode生成二維碼的實(shí)現(xiàn)示例
本文主要介紹了Qt結(jié)合libqrencode生成二維碼的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C語言實(shí)現(xiàn)簡單的停車場管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單的停車場管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語言結(jié)構(gòu)體數(shù)組同時(shí)賦值的另類用法
今天小編就為大家分享一篇關(guān)于C語言結(jié)構(gòu)體數(shù)組同時(shí)賦值的另類用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12使用Visual Studio 2010/2013編譯V8引擎步驟分享
這篇文章主要介紹了使用Visual Studio 2013編譯V8引擎步驟分享,需要的朋友可以參考下2015-08-08c語言實(shí)現(xiàn)輸入一組數(shù)自動(dòng)從大到小排列的實(shí)例代碼
下面小編就為大家?guī)硪黄猚語言實(shí)現(xiàn)輸入一組數(shù)自動(dòng)從大到小排列的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09VisualStudio?制作Dynamic?Link?Library動(dòng)態(tài)鏈接庫文件的詳細(xì)過程
這篇文章主要介紹了VisualStudio?制作Dynamic?Link?Library動(dòng)態(tài)鏈接庫文件的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08