中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

深圳最近消息自己做seo網(wǎng)站推廣

深圳最近消息,自己做seo網(wǎng)站推廣,優(yōu)化營(yíng)商環(huán)境調(diào)度,杭州專業(yè)建設(shè)網(wǎng)站哪里好🌇個(gè)人主頁(yè):_麥麥_ 📚今日小句:快樂(lè)的方式有很多種,第一種便是見到你。 目錄 一、前言 二、vector的介紹及使用 2.1 vector的介紹 2.2 vector的使用 2.2.1 vector的定義(構(gòu)造函數(shù)) 2.2.2…

?🌇個(gè)人主頁(yè):_麥麥_?

📚今日小句:快樂(lè)的方式有很多種,第一種便是見到你。

?

目錄

一、前言

二、vector的介紹及使用

2.1 vector的介紹

2.2 vector的使用

2.2.1 vector的定義(構(gòu)造函數(shù))

2.2.2 vector迭代器的使用

?2.2.3 vector 空間增長(zhǎng)問(wèn)題

2.2.3vector增刪查改

2.2.4 vector迭代器失效問(wèn)題

三、vector的模擬實(shí)現(xiàn)

3.1成員變量與構(gòu)造函數(shù)

3.2 insert與reverse

3.3 析構(gòu)函數(shù)

3.4 【】的重載

3.5 insert

3.5 erase

3.6 pop_back

?3.7 resize

3.8? 其他構(gòu)造

3.9 賦值重載

四、全部代碼

五、結(jié)語(yǔ)

一、前言

? ? ? ? 今天為大家?guī)?lái)vector的介紹和模擬實(shí)現(xiàn),文章若有不足之處,歡迎大家給出指正!

二、vector的介紹及使用

2.1 vector的介紹

1. vector是表示可變大小數(shù)組的序列容器。

2. 就像數(shù)組一樣,vector也采用的連續(xù)存儲(chǔ)空間來(lái)存儲(chǔ)元素。也就是意味著可以采用下標(biāo)對(duì)vector的元素進(jìn)行訪問(wèn),和數(shù)組一樣高效。但是又不像數(shù)組,它的大小是可以動(dòng)態(tài)改變的,而且它的大小會(huì)被容器自動(dòng)處理。

3. 本質(zhì)講,vector使用動(dòng)態(tài)分配數(shù)組來(lái)存儲(chǔ)它的元素。當(dāng)新元素插入時(shí)候,這個(gè)數(shù)組需要被重新分配大小為了增加存儲(chǔ)空間。其做法是,分配一個(gè)新的數(shù)組,然后將全部元素移到這個(gè)數(shù)組。就時(shí)間而言,這是 一個(gè)相對(duì)代價(jià)高的任務(wù),因?yàn)槊慨?dāng)一個(gè)新的元素加入到容器的時(shí)候,vector并不會(huì)每次都重新分配大小。

4. vector分配空間策略:vector會(huì)分配一些額外的空間以適應(yīng)可能的增長(zhǎng),因?yàn)榇鎯?chǔ)空間比實(shí)際需要的存儲(chǔ)空間更大。不同的庫(kù)采用不同的策略權(quán)衡空間的使用和重新分配。但是無(wú)論如何,重新分配都應(yīng)該是對(duì)數(shù)增長(zhǎng)的間隔大小,以至于在末尾插入一個(gè)元素的時(shí)候是在常數(shù)時(shí)間的復(fù)雜度完成的。

5. 因此,vector占用了更多的存儲(chǔ)空間,為了獲得管理存儲(chǔ)空間的能力,并且以一種有效的方式動(dòng)態(tài)增 長(zhǎng)。

6. 與其它動(dòng)態(tài)序列容器相比(deque, list and forward_list), vector在訪問(wèn)元素的時(shí)候更加高效,在末尾添加和刪除元素相對(duì)高效。對(duì)于其它不在末尾的刪除和插入操作,效率更低。比起list和forward_list 統(tǒng)一的迭代器和引用更好。

2.2 vector的使用

2.2.1 vector的定義(構(gòu)造函數(shù))

(construct)構(gòu)造函數(shù)聲明接口說(shuō)明
vector()無(wú)參構(gòu)造
vector(size_type n, const value_type& val = value_type())

構(gòu)造并初始化n個(gè)val

vector(const vector& x)拷貝構(gòu)造
vector((InputIterator ?rst, InputIterator last)使用迭代器進(jìn)行初始化構(gòu)造

2.2.2 vector迭代器的使用

ieterator的使用接口說(shuō)明
begin+end獲取第一個(gè)數(shù)據(jù)位置的iterator/const_iterator, 獲取最后一個(gè)數(shù)據(jù)的下一個(gè)位置 的iterator/const_iterator
rbegin+rend獲取最后一個(gè)數(shù)據(jù)位置的reverse_iterator,獲取第一個(gè)數(shù)據(jù)前一個(gè)位置的 reverse_iterator

?

?

? ? ? ? ?對(duì)于正向迭代器來(lái)言,通過(guò)begin()和end()獲得的區(qū)間是一個(gè)左閉右開的區(qū)間,也就是end()所返回的迭代器指向的vector的最后一位有效數(shù)據(jù)的下一位

? ? ? ? 對(duì)于反向迭代器,我們知道通過(guò)它我們能夠反向的遍歷vector這個(gè)容器,但是它的實(shí)現(xiàn)并不只是簡(jiǎn)單地將正向迭代器頭尾進(jìn)行交換,通過(guò)上圖我們也能夠發(fā)現(xiàn),具體的原因和實(shí)現(xiàn)我們會(huì)在下面的模擬實(shí)現(xiàn)為大家娓娓道來(lái)。

?2.2.3 vector 空間增長(zhǎng)問(wèn)題

容量空間接口說(shuō)明
size

獲取數(shù)據(jù)個(gè)數(shù)

capacity獲取容量大小
empty判斷是否為空
resize改變vector的size
reserve改變vector的capacity

? ? ? ? 首先,我們要知道的是對(duì)于vector的這個(gè)容器,當(dāng)我們?cè)谶M(jìn)行插入數(shù)據(jù),并不需要手動(dòng)擴(kuò)容,因?yàn)樗鼤?huì)自動(dòng)的根據(jù)容器中_size和_capacity兩者的比較來(lái)判斷在插入數(shù)據(jù)前容器是否已滿,如果已滿就會(huì)將該容器擴(kuò)容,但具體的擴(kuò)容大下則是根據(jù)不同的編譯環(huán)境有著不同的實(shí)現(xiàn),有的是按照1.5倍_capacity來(lái)進(jìn)行擴(kuò)容,有的則是按照2倍_capacity來(lái)進(jìn)行擴(kuò)容。

? ? ? ? 其次,除了vector自行的擴(kuò)容會(huì)對(duì)vector的容量進(jìn)行改變,它還提供了兩個(gè)與容器大小有關(guān)的接口resize和reserve來(lái)供我們使用。對(duì)于前者,按字面意義來(lái)說(shuō)就是改變vector的_size。當(dāng)我們使用這個(gè)函數(shù)的時(shí)候大抵會(huì)面對(duì)三種種情況:1.輸入量>容量 2.有效數(shù)據(jù)<輸入量<容量 3.輸入量<有效數(shù)據(jù)。

? ? ? ? 對(duì)于第一種情況,編譯器便會(huì)對(duì)當(dāng)前容器進(jìn)行擴(kuò)容的操作。而對(duì)于第二情況,由于當(dāng)前容器的capacity能夠滿足我們對(duì)size的需求,就會(huì)在當(dāng)前有效數(shù)據(jù)后填補(bǔ)我們所輸入的數(shù)據(jù)至size。最后一種情況的下,由于我們輸入的size小于有效數(shù)據(jù),那么我們便要減小有效數(shù)據(jù)的數(shù)量至輸入的_size。

? ? ? ? 最后呢,是reserve這一個(gè)接口。它最主要的作用就是能夠幫助我們開辟空間,以減少容器的不斷擴(kuò)容,需要注意的一點(diǎn)是當(dāng)我們的輸入容量小于目前容量時(shí),一般情況下,編譯器并不會(huì)將多余的容量的進(jìn)行釋放。這是因?yàn)楫?dāng)我們釋放空間的時(shí)候,只能釋放一整塊空間,而不能釋放一塊空間的一小部分。否則代價(jià)會(huì)極大。

? ? ? ??

ps:reserve負(fù)責(zé)開辟空間,而resize在開空間的同時(shí)還會(huì)進(jìn)行初始化,影響size

2.2.3vector增刪查改

vector增刪查改接口說(shuō)明
push_back尾插
pop_back尾刪
find查找(注意這個(gè)是算法模塊實(shí)現(xiàn),不是vector的成員接口)
insert在position之前插入val
erase刪除position位置的數(shù)據(jù)
swap交換兩個(gè)vector的數(shù)據(jù)空間
operator[]像數(shù)組一樣訪問(wèn)

2.2.4 vector迭代器失效問(wèn)題

迭代器的主要作用就是讓算法能夠不用關(guān)心底層數(shù)據(jù)結(jié)構(gòu),其底層實(shí)際就是一個(gè)指針,或者是對(duì)指針進(jìn)行了 封裝,比如:vector的迭代器就是原生態(tài)指針T* 。因此迭代器失效,實(shí)際就是迭代器底層對(duì)應(yīng)指針?biāo)赶虻目臻g被銷毀了,而使用一塊已經(jīng)被釋放的空間,造成的后果是程序崩潰(即如果繼續(xù)使用已經(jīng)失效的迭代器, 程序可能會(huì)崩潰)。 對(duì)于vector可能會(huì)導(dǎo)致其迭代器失效的操作有:

①會(huì)引起其底層空間改變的操作,都可能使迭代器失效,比如:resize、reserve、insert、assign、push_back等

指定位置元素的刪除操作-erase。erase刪除pos位置元素后,pos位置之后的元素會(huì)往前搬移,沒(méi)有導(dǎo)致底層空間的改變,理論上講迭代器不應(yīng)該會(huì)失效,但是:如果pos剛好是最后一個(gè)元素,刪完之后pos剛好是end的位置,而end位置是沒(méi)有元素的,那么pos就失效了。因此刪除vector中任意位置上元素時(shí),vs就認(rèn)為該位置迭代器失效了。

注:與vector類似,string在插入+擴(kuò)容操作+erase之后,迭代器也會(huì)失效

#include <iostream>
using namespace std;
#include <vector>//底層空間改變引起的迭代器失效
void text_1()
{vector<int> v(10, 5);auto it = v.begin();//將有效元素個(gè)數(shù)增加到150個(gè),多出的位置用2來(lái)填充,操作期間底層會(huì)擴(kuò)容//v.resize(150, 2);//reserve的做優(yōu)就是改變擴(kuò)容大小但不改變有效元素個(gè)數(shù),操作期間可能會(huì)引起底層容量改變//v.reserve(150);//插入元素期間可能引起擴(kuò)容,而導(dǎo)致原空間被釋放//v.push_back(8);//v.insert(v.begin(), 8);//給vector重新賦值,可能會(huì)引起的層容量改變v.assign(150, 8);/*出錯(cuò)原因:以上操作,都有可能會(huì)導(dǎo)致vector擴(kuò)容,也就是說(shuō)vector底層原理舊空間被釋放掉,而在打印時(shí),it還使用的是釋放之間的舊空間,在對(duì)it迭代器操作時(shí),實(shí)際操作的是一塊已經(jīng)被釋放的空間,而引起代碼運(yùn)行時(shí)崩潰。解決方式:在以上操作完成之后,如果想要繼續(xù)通過(guò)迭代器操作vector中的元素,只需給it重新賦值即可。*/while (it != v.end()){cout << *it;++it;}cout << endl;
}//使用erase導(dǎo)致的迭代器失效
void text_2()
{vector<int> v = {1,2,3,4,5};auto it = find(v.begin(), v.end(), 4);v.erase(it);cout << *it << endl;}int main()
{//text_1();text_2();return 0;
}

三、vector的模擬實(shí)現(xiàn)

3.1成員變量與構(gòu)造函數(shù)

? ? ? ? 當(dāng)我們最開始了解一個(gè)容器的時(shí)候,最先研究的就是它的成員變量與構(gòu)造函數(shù),所以當(dāng)我們?cè)谀M實(shí)現(xiàn)的時(shí)候,自然也是從此開始著手。

? ? ? ? 首先是vector的成員變量,它的成員變量可是與string是不一樣的,string是一個(gè)char*的指針加上size和capacity,而vector的則是由三個(gè)迭代器組成,分別是指向起始位置有效數(shù)據(jù)的下一位存儲(chǔ)的最大容量。

? ? ? ? 然后是構(gòu)造函數(shù),我們會(huì)模擬實(shí)現(xiàn)常見的三種構(gòu)造函數(shù),分別是無(wú)參的構(gòu)造,n個(gè)值的構(gòu)造以及一段迭代器區(qū)間構(gòu)造。至于其中涉及的函數(shù),會(huì)在下面具體介紹,

? ? ? ? 代碼如下:

namespace mine
{template <class T>class vector{typedef T* iterator;typedef const T* const_iterator;public:vector():_start(nullptr),_finish(nullptr),_endofstorage(nullptr){}vector(size_t n, const T& val = T()){resize(n, val);}template<class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}private:iterator _start=nullptr;iterator _finish=nullptr;iterator _endofstorage=nullptr;};}

?

?

3.2 insert與reverse

? ? ? ? 在能夠能夠成功創(chuàng)建出一個(gè)vector對(duì)象,接下來(lái)就是實(shí)現(xiàn)數(shù)據(jù)的插入了?,我們先來(lái)實(shí)現(xiàn)最簡(jiǎn)單的尾插。?在進(jìn)行數(shù)據(jù)的尾插之前,我們第一步要做的就是檢查當(dāng)前容器的容量,如果容量已滿,那么我們就需要對(duì)當(dāng)前的容器進(jìn)行擴(kuò)容,也就是reverse的操作。

? ? ? ? 具體代碼如下:

        void reserve(size_t n){if (n > capacity()){size_t sz = size();T* tmp = new T[n];size_t i = 0;while (i != size()){tmp[i] = _start[i];++i;}delete[] _start;/*		if (_start){memcpy(tmp, _start, sizeof(T)*size());delete[] _start;}*/_start = tmp;_finish = tmp + sz;_endofstorage = tmp + n;}}void push_back(const T& x){//擴(kuò)容if (_finish == _endofstorage){size_t newcapacity = (_start == nullptr ? 4 : 2 * (_finish - _start));reserve(newcapacity);}//插入數(shù)據(jù)*_finish= x;++_finish;}

3.3 析構(gòu)函數(shù)

? ? ? ? 對(duì)于vector的析構(gòu)函數(shù),我們只需要將申請(qǐng)的空間釋放,并將成員變量定義為空指針即可,具體代碼如下:?

~vector(){if (_start){delete[] _start;_start = _finish = _endofstorage = nullptr;}}

3.4 【】的重載

? ? ? ? 對(duì)于vector來(lái)說(shuō),它也重載了【】操作符,我們只需對(duì)_start迭代器進(jìn)行處理即可得到我們想要的數(shù)據(jù)。

? ? ? ? 具體代碼如下:

        T& operator[](size_t pos){assert(pos < size());return _start[pos];}const T& operator[](size_t pos) const{assert(pos < size());return _start[pos];}

3.5 insert

? ? ? ? ?由于vector的存儲(chǔ)空間是連續(xù)的,因此當(dāng)我們進(jìn)行數(shù)據(jù)插入的時(shí)候,尾插的效率是最高的,當(dāng)然,有時(shí)我們也不可避免的會(huì)遇到頭插或者在中間插入數(shù)據(jù)的情況。于是便提供了insert的這個(gè)接口。

? ? ? ? 在本節(jié)中我們實(shí)現(xiàn)的是在指定位置位置插入一個(gè)有效數(shù)據(jù),那么在實(shí)現(xiàn)這個(gè)成員函數(shù)的時(shí)候倘若一不小心,就會(huì)碰到我們?cè)谇懊嬷v過(guò)的迭代器失效的問(wèn)題。為什么會(huì)迭代器失效呢,因?yàn)楫?dāng)我們?cè)谶M(jìn)行數(shù)據(jù)的插入時(shí),如果容器內(nèi)的數(shù)據(jù)已滿,就需要進(jìn)行擴(kuò)容的操作,那么擴(kuò)容之后,傳進(jìn)來(lái)的迭代器位置就有可能并不指向容器位置,因而導(dǎo)致了迭代器失效。那么為了解決這個(gè)問(wèn)題,當(dāng)我們?cè)?span style="color:#fe2c24;">擴(kuò)容之后,就需要重新對(duì)傳進(jìn)來(lái)的迭代器進(jìn)行一個(gè)重新的賦值,保證其仍指向容器的數(shù)據(jù)。為了做到這一點(diǎn),我們需要的便是在進(jìn)行擴(kuò)容之間先記錄pos迭代器的相對(duì)位置。

? ? ? ? 具體實(shí)現(xiàn)如下:

        void insert(iterator pos ,const T& x){assert(pos >=_start && pos<=_endofstorage);size_t dis = pos - _start;//擴(kuò)容if (_finish == _endofstorage){size_t newcapacity = (_start == nullptr ? 4 : 2 * (_finish - _start));reserve(newcapacity);//避免pos迭代器失效pos = _start + dis;}//插入數(shù)據(jù){size_t len = _finish-pos;T* end = _finish;//挪動(dòng)數(shù)據(jù)while (end >= pos){*(end + 1) = *end;--end;}//插入數(shù)據(jù)*pos = x;++_finish;}

3.5 erase

? ? ? ? 在實(shí)現(xiàn)完vector的插入和尾插后,那么當(dāng)我們想要?jiǎng)h除某些數(shù)據(jù)的時(shí)候,就要用到erase這個(gè)函數(shù)了,在這面我們實(shí)現(xiàn)的僅僅是簡(jiǎn)單地刪除指定位置的一個(gè)有效數(shù)據(jù)。

? ? ? ? 對(duì)于erase而言,也會(huì)面臨的pos迭代器失效的問(wèn)題,當(dāng)我們刪除的是尾部最后一個(gè)數(shù)據(jù)的時(shí)候,那么面對(duì)這樣的情況,我們的解決方法就是給erase函數(shù)增加一個(gè)返回值,返回值是指向刪除數(shù)據(jù)的下一個(gè)數(shù)據(jù)的迭代器,那么當(dāng)我們?cè)谑褂眠@個(gè)函數(shù)的時(shí)候只要去接受這個(gè)返回值來(lái)對(duì)pos進(jìn)行更新就不會(huì)出現(xiàn)迭代器失效的問(wèn)題了。

? ? ? ? 具體代碼如下:?

	    iterator erase(iterator pos){assert(pos >= _start && pos < _finish);iterator tmp = pos + 1;while (tmp != _finish){*(tmp - 1) = *tmp;++tmp;}--_finish;return pos;}

3.6 pop_back

? ? ? ? 在實(shí)現(xiàn)完erase后,尾刪的話我們只需要復(fù)用這個(gè)函數(shù)即可,對(duì)尾部的迭代器進(jìn)行--即可實(shí)現(xiàn)尾刪的功能。

? ? ? ? 具體代碼如下:?

    	void pop_back(){erase(end()-1);}

?3.7 resize

? ? ? ? 在實(shí)現(xiàn)完reverse之后,緊隨其后的就是resize。在前面我們已經(jīng)提到了,在對(duì)vector進(jìn)行resize的時(shí)候我們會(huì)面臨三種情況:1.輸入量>容量 2.有效數(shù)據(jù)<輸入量<容量 3.輸入量<有效數(shù)據(jù)。

? ? ? ? 對(duì)于第一種情況,編譯器便會(huì)對(duì)當(dāng)前容器進(jìn)行擴(kuò)容的操作。而對(duì)于第二情況,由于當(dāng)前容器的capacity能夠滿足我們對(duì)size的需求,就會(huì)在當(dāng)前有效數(shù)據(jù)后填補(bǔ)我們所輸入的數(shù)據(jù)至size。最后一種情況的下,由于我們輸入的size小于有效數(shù)據(jù),那么我們便要減小有效數(shù)據(jù)的數(shù)量至輸入的_size。

? ? ? ? 具體實(shí)現(xiàn)如下:

        void resize(size_t n, const T& val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish != _start + n){*_finish = val;++_finish;}}}

3.8? 其他構(gòu)造

? ? ? ? 在前面較為基礎(chǔ)的構(gòu)造之外,接下來(lái)我們來(lái)實(shí)現(xiàn)vector的其他構(gòu)造。

? ? ? ? 首先是拷貝構(gòu)造,一種是傳統(tǒng)的寫法,就是開好空間后,利用memcpy將另一個(gè)對(duì)象拷貝過(guò)去,另一種則是復(fù)用尾插,將數(shù)據(jù)一個(gè)個(gè)插入進(jìn)去。對(duì)于前者的話會(huì)存在一個(gè)淺拷貝的問(wèn)題,vector中存儲(chǔ)的是內(nèi)置類型的話,memcpy是沒(méi)有問(wèn)題的,但是如果是自定義類型的話就會(huì)存在一個(gè)淺拷貝的問(wèn)題,這是由于memcpy是按字節(jié)進(jìn)行拷貝的,為了解決這個(gè)問(wèn)題,我們?cè)谶M(jìn)行擴(kuò)容的的時(shí)候,就不能再使用memcpy的方式來(lái)拷貝數(shù)據(jù),而是通過(guò)賦值的方式來(lái)調(diào)用自定義類型的賦值重載,這樣就實(shí)現(xiàn)了深拷貝。

? ? ? ?然后是n個(gè)值來(lái)初始化vector,思路大致就是復(fù)用我們已經(jīng)寫好的resize就可以了

? ? ? ?最后就是用一段迭代器區(qū)間來(lái)初始化vector,實(shí)現(xiàn)起來(lái)主要就是在用一個(gè)類模板,不過(guò)在實(shí)際當(dāng)我們?cè)谑褂胣個(gè)值來(lái)初始化vector的時(shí)候,會(huì)出現(xiàn)匹配的歧義,它會(huì)與迭代器的這個(gè)構(gòu)造更加匹配,因此面對(duì)匹配歧義這個(gè)問(wèn)題,我們可以再重載一個(gè)n個(gè)值來(lái)初始化的構(gòu)造函數(shù),只需要將前面的類型修改為int即可。

? ? ? ? 具體代碼如下:

       //傳統(tǒng)寫法vector(const vector& v){_start = new T[v.capacity()];_finish = _start + v.size();_endofstorage = _start + v.capacity();size_t n = 0;while (n != size()){*(_start + n) = *(v.begin() + n);++n;}}//復(fù)用寫法vector(const vector& v){reserve(v.capacity());for (auto e : v){push_back(e);}}vector(size_t n, const T& val = T()){resize(n, val);}vector(int n, const T& val = T()){resize(n, val);}template<class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}

3.9 賦值重載

? ? ? ? 在實(shí)現(xiàn)vector的賦值重載我們依舊可以采取像前面string的類似方法,通過(guò)與形參交換成員變量來(lái)達(dá)到賦值拷貝的效果。

? ? ? ? 具體代碼如下:?

	    void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage,v._endofstorage);}vector<T>&  operator=( vector<T> v){swap(v);return *this;}

四、全部代碼

#pragma once
#include <assert.h>namespace mine
{template <class T>class vector{typedef T* iterator;typedef const T* const_iterator;public:vector():_start(nullptr),_finish(nullptr),_endofstorage(nullptr){}vector(size_t n, const T& val = T()){resize(n, val);}vector(int n, const T& val = T()){resize(n, val);}template<class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}void reserve(size_t n){if (n > capacity()){size_t sz = size();T* tmp = new T[n];size_t i = 0;while (i != size()){tmp[i] = _start[i];++i;}delete[] _start;/*		if (_start){memcpy(tmp, _start, sizeof(T)*size());delete[] _start;}*/_start = tmp;_finish = tmp + sz;_endofstorage = tmp + n;}}void push_back(const T& x){//擴(kuò)容if (_finish == _endofstorage){size_t newcapacity = (_start == nullptr ? 4 : 2 * (_finish - _start));reserve(newcapacity);}//插入數(shù)據(jù)*_finish= x;++_finish;}void insert(iterator pos ,const T& x){assert(pos >=_start && pos<=_endofstorage);size_t dis = pos - _start;//擴(kuò)容if (_finish == _endofstorage){size_t newcapacity = (_start == nullptr ? 4 : 2 * (_finish - _start));reserve(newcapacity);//避免pos迭代器失效pos = _start + dis;}//插入數(shù)據(jù){size_t len = _finish-pos;T* end = _finish;//挪動(dòng)數(shù)據(jù)while (end >= pos){*(end + 1) = *end;--end;}//插入數(shù)據(jù)*pos = x;++_finish;}}iterator erase(iterator pos){assert(pos >= _start && pos < _finish);iterator tmp = pos + 1;while (tmp != _finish){*(tmp - 1) = *tmp;++tmp;}--_finish;return pos;}void pop_back(){erase(end()-1);}void resize(size_t n, const T& val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish != _start + n){*_finish = val;++_finish;}}}//傳統(tǒng)寫法/*	vector(const vector& v){_start = new T[v.capacity()];_finish = _start + v.size();_endofstorage = _start + v.capacity();size_t n = 0;while (n != size()){*(_start + n) = *(v.begin() + n);++n;}}*///復(fù)用寫法vector(const vector& v){reserve(v.capacity());for (auto e : v){push_back(e);}}void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage,v._endofstorage);}vector<T>&  operator=( vector<T> v){swap(v);return *this;}T& operator[](size_t pos){assert(pos < size());return _start[pos];}const T& operator[](size_t pos) const{assert(pos < size());return _start[pos];}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}size_t size() const{return _finish - _start;}size_t capacity() const{return _endofstorage - _start;}~vector(){if (_start){delete[] _start;_start = _finish = _endofstorage = nullptr;}}private:iterator _start=nullptr;iterator _finish=nullptr;iterator _endofstorage=nullptr;};void print(const vector<int>& v){for (auto e : v){cout << e<<' ';}cout << endl;}
}

五、結(jié)語(yǔ)

?????????到此為止,關(guān)于vector的講解就告一段落了,至于其他的內(nèi)容,小伙伴們敬請(qǐng)期待呀!

? ? ? ? 關(guān)注我 _麥麥_分享更多干貨:_麥麥_-CSDN博客
? ? ? ? 大家的「關(guān)注?? + 點(diǎn)贊👍 + 收藏?」就是我創(chuàng)作的最大動(dòng)力!謝謝大家的支持,我們下期見!?

http://www.risenshineclean.com/news/55112.html

相關(guān)文章:

  • 網(wǎng)站開發(fā)要服務(wù)器嗎東莞網(wǎng)站推廣企業(yè)
  • 有哪些網(wǎng)站可以做外貿(mào)網(wǎng)站推廣的途徑和方法
  • h5 做的網(wǎng)站 價(jià)格葫島百度seo
  • 做gif動(dòng)圖的網(wǎng)站犯法嗎seo文章優(yōu)化技巧
  • 個(gè)人可以做視頻網(wǎng)站嗎企業(yè)查詢寶
  • 大慶開發(fā)網(wǎng)站公司每日新聞
  • 怎么注冊(cè)網(wǎng)站賬號(hào)seo查詢
  • 哈爾濱網(wǎng)站建設(shè)信息網(wǎng)站如何做優(yōu)化排名
  • 現(xiàn)成的手機(jī)網(wǎng)站做APP最近實(shí)時(shí)熱點(diǎn)事件
  • 培訓(xùn)網(wǎng)站建設(shè)永州網(wǎng)站seo
  • 網(wǎng)站建設(shè)入門教程對(duì)網(wǎng)絡(luò)營(yíng)銷的認(rèn)識(shí)800字
  • 網(wǎng)頁(yè)工具東莞優(yōu)化排名公司
  • 農(nóng)業(yè)網(wǎng)站建設(shè)方案 ppt搜索推廣平臺(tái)
  • 有什么網(wǎng)站是做平面設(shè)計(jì)的百度搜索的優(yōu)勢(shì)
  • 真人性做爰video網(wǎng)站公司網(wǎng)站建站要多少錢
  • 深圳做積分商城網(wǎng)站建設(shè)怎么制作鏈接網(wǎng)頁(yè)
  • 深圳分銷網(wǎng)站設(shè)計(jì)電話企業(yè)網(wǎng)站建設(shè)
  • 公司建一個(gè)網(wǎng)站嗎搜什么關(guān)鍵詞能搜到好片
  • 廣州知名網(wǎng)站建設(shè)哪家公司好seo文案范例
  • 產(chǎn)品網(wǎng)站建設(shè)軟文推廣營(yíng)銷平臺(tái)
  • 家里電腦做網(wǎng)站服務(wù)器seo推廣怎么樣
  • 網(wǎng)站開發(fā)什么意思徐州seo公司
  • 河南新鄉(xiāng)市建設(shè)銀行網(wǎng)站系統(tǒng)優(yōu)化軟件排行榜
  • 競(jìng)價(jià)網(wǎng)站做seo教育培訓(xùn)機(jī)構(gòu)官網(wǎng)
  • 武漢網(wǎng)絡(luò)推廣有哪些公司鄂爾多斯seo
  • 湛江找人做網(wǎng)站排名球隊(duì)排名榜實(shí)時(shí)排名
  • 網(wǎng)站建設(shè)中 html營(yíng)銷課程
  • 做網(wǎng)站如何設(shè)計(jì)數(shù)據(jù)庫(kù)個(gè)人網(wǎng)頁(yè)設(shè)計(jì)作品模板
  • wordpress .htaccess 規(guī)則seo代碼優(yōu)化工具
  • 門戶網(wǎng)站功能清單萬(wàn)網(wǎng)域名查詢注冊(cè)商