国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??博主CSDN主頁(yè):杭電碼農(nóng)-NEO??
?
?專欄分類:C++從入門到精通?
?
??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記??
?
??關(guān)注我??帶你學(xué)習(xí)C++
? ????


【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

1. 前言

和string的學(xué)習(xí)不同
vector即要掌握它的用法
更要會(huì)自己去實(shí)現(xiàn)一個(gè)vector

本章重點(diǎn):

熟悉STL庫(kù)中vector的接口函數(shù)
自己實(shí)現(xiàn)一個(gè)簡(jiǎn)易vector類
本章只實(shí)現(xiàn)容量相關(guān)函數(shù)
和構(gòu)造,析構(gòu),拷貝構(gòu)造函數(shù)

注:vector其實(shí)就是順序容器
string類只用考慮存儲(chǔ)字符
然而vector中可以存儲(chǔ)任一類型
所以vector的自我實(shí)現(xiàn)需要用模板


2. 熟悉vector的接口函數(shù)

還是借助老朋友:cplusplus來(lái)查閱文檔

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

庫(kù)中的vector的模板參數(shù)有兩個(gè)
后一個(gè)是內(nèi)存池,用來(lái)提升空間利用效率
對(duì)于現(xiàn)階段的學(xué)習(xí)而言可有可無(wú)


2.1 vector的構(gòu)造與拷貝構(gòu)造

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

常見的構(gòu)造有:

vector<int> v1;
vector<int> v2(10,1);
vector<int> v3(v2);

v2:構(gòu)造并初始化10個(gè)值為1的順序表

vector可以用迭代器區(qū)間初始化:

string str("abcdefg");
vector<string> vv(str.begin(),str.end());

2.2 vector迭代器的使用

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言
和string一樣,vector有正向和反向
兩種迭代器,且使用方法和string相同

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

vector<int> vv{1,2,3,4,5,6};
vector<int>::iterator it = vv.begin();
while(it!=vv.end())
{
	cout<<*it;
	it++;
}

2.3 vector空間相關(guān)函數(shù)

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

vector的空間相關(guān)的函數(shù)
和string的機(jī)會(huì)一模一樣
如果你看了文檔還不懂的話
可以先閱讀此篇文章:string接口函數(shù)


2.4 vector的增刪查改

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言
push_back和pop_back
都是老朋友了,這里就不多說(shuō)了
在介紹insert和erase之前
先來(lái)了解幾個(gè)算法庫(kù)的函數(shù)


2.41 find,swap和sort

這三個(gè)函數(shù)都在頭文件:algorithm

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

find函數(shù):參數(shù)是一段迭代器區(qū)間
以及在此區(qū)間你需要查找的值
找到后返回這個(gè)值對(duì)應(yīng)的迭代器位置
若找不到,則返回迭代器last

find的使用:

vector<int> vv{1,2,3,4,5,6,7,8,9};
auto pos = find(vv.begin(),vv.end(),5);
cout<<*pos;

注:使用auto是為了簡(jiǎn)寫迭代器也可以用
vector< int >::iterator替代

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

swap想必是大家的??土?br> 這里給它個(gè)面子,就不介紹它了

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

sort非常方便,它內(nèi)部實(shí)現(xiàn)是快排
我們只需要傳一個(gè)迭代器區(qū)間
就可以將整個(gè)區(qū)間排好序

sort的使用:

vector<int> vv{5,7,3,9,6,4,1,2,8};
sort(vv.begin().vv.end());

2.42 insert和erase

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

和string不同,vector的insert
的參數(shù)pos不是整型,而是迭代器
默認(rèn)是在pos位置前插入一個(gè)數(shù)據(jù)

insert和find常常配合在一起使用

在整型5前面插入一個(gè)100:

vector<int> vv{1,2,3,4,5,6,7,8,9};
auto pos = find(vv.begin(),vv.end(),5);
vv.insert(pos,100);

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

和string的erase不同,vector
的erase一次只刪除一個(gè)數(shù)據(jù)
然而string如果使用缺省值就是
將全部數(shù)據(jù)刪完

vector的erase甚至可以刪除一段區(qū)間

刪除順序表中值為100的元素

vector<int> vv{1,2,3,4,5,6,7,8,9,100};
auto pos = find(vv.begin(),vv.end(),100);
vv.erase(pos);
//刪除一個(gè)區(qū)間
vv.erase(vv.begin()+2,vv.end()-2);

2.43 隨機(jī)訪問operator[ ]

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

vector中最喜歡用的是[ ]
它支持隨機(jī)訪問,是否方便

operator[]的使用:

vector<int> vv{1,2,3,4,5,6,7,8,9};
for(int i=0;i<vv.size();i++)
{
	cout<<vv[i]<<" ";
}

3. vector的模擬實(shí)現(xiàn)

首先要關(guān)注的是成員變量
vector是順序表,所以和實(shí)現(xiàn)C語(yǔ)言
時(shí)的順序表一樣,至少有三個(gè)參數(shù)

  1. 指向一段空間的指針
  2. 空間的有效大小
  3. 空間的實(shí)際大小

由于vector的迭代器就是普通指針
所以成員變量的類型其實(shí)是迭代器

template<class T>
class vector
{
public:
	typedef T* iterator;

private:
	iterator _start;
	iterator _finish;
	iterator _endof_storage;

這里使用迭代器作為三個(gè)參數(shù)的類型
是因?yàn)?求vector的size和capacity時(shí)
可以直接使用finish-start
也就是指針相減求出長(zhǎng)度

成員變量和空間的關(guān)系:

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言


3.1 vector容量相關(guān)函數(shù)

上來(lái)首先要考慮的容量相關(guān)的函數(shù):

  • size
  • capacity
  • empty
  • resize
  • reverse

前三個(gè)十分簡(jiǎn)單:

size_t size() const
{
	return _finish - _start;
}

size_t capacity() const
{
	return _endof_storage - _finish;
}

bool empty() const
{
	return (size()==0);
}

3.11 reverse函數(shù)

reverse只會(huì)改變capacity的大小
并不會(huì)改變size的大小

void reserve(size_t n)
{
	if (n > capacity())
	{
		size_t sz = size();
		T* tmp = new T[n];
		if (_start)
		{
			//memcpy(tmp, _start, sizeof(T)*sz);
			for (size_t i = 0; i < sz; ++i)
			{
				tmp[i] = _start[i];
			}
			delete[] _start;
		}

		_start = tmp;
		_finish = _start + sz;
		_end_of_storage = _start + n;
	}
}

注:當(dāng)n小于capacity時(shí),不進(jìn)行擴(kuò)容

由于C++內(nèi)存管理的new
無(wú)法像C語(yǔ)言的realloc一樣原地?cái)U(kuò)容
所以必須先開辟n個(gè)空間,再將數(shù)據(jù)
拷貝到新空間,且釋放舊空間


3.12 resize函數(shù)

resize即會(huì)改變size大小
也會(huì)改變capacity大小

resize要分三種情況:

  1. n大于capacity時(shí)
  2. n大于size小于capacity時(shí)
  3. n小于size時(shí)

它們的解決方案分別是:

  • 直接套用reversezhu

  • 初始有效值不變,在此之后
    初始化新的內(nèi)容

  • 直接將size縮小到n

void resize(size_t n, const T& val = T())
{
	if (n > capacity())
	{
		reserve(n);
	}

	if (n > size())
	{
		// 初始化填值
		while (_finish < _start + n)
		{
			*_finish = val;
			++_finish;
		}
	}
	else
	{
		_finish = _start + n;
	}
}

注:參數(shù)val=T()使用了匿名對(duì)象
C++將內(nèi)置類型特殊處理過
int/char等等都被升級(jí)為了類
所以可以使用int()表示匿名對(duì)象

int tmp1 = int();
int tmp2 = int(10);

int的缺省值為0


3.2 vector的構(gòu)造函數(shù)

  1. 首先最簡(jiǎn)單的無(wú)參構(gòu)造:
vector()
	:_start(nullptr)
	, _finish(nullptr)
	, _end_of_storage(nullptr)
{}
  1. 緊接著是帶參的構(gòu)造函數(shù)
    我們跟著STL庫(kù)的風(fēng)格走:
vector(size_t n, const T& val = T())
	:_start(nullptr)
	, _finish(nullptr)
	, _end_of_storage(nullptr)
{
	reserve(n);//開辟n個(gè)空間
	for (size_t i = 0; i < n; ++i)
	{
		push_back(val);//給初始值賦值
	}
}
  1. 最后是使用迭代器區(qū)間來(lái)構(gòu)造
    比如我想在順序表中存放string類型:
string str("abcdefg");
vector<string> vv(str.begin(),str.end());

此時(shí)在模板類中還應(yīng)該有一個(gè)模板

template <class InputIterator>
vector(InputIterator first, InputIterator last)
	:_start(nullptr)
	, _finish(nullptr)
	, _end_of_storage(nullptr)
{
	while (first != last)
	{
		push_back(*first);
		++first;
	}
}

注:inputiterator取名是模仿STL的
你也可以取任一除了T的名字


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

vector的析構(gòu)函數(shù)非常簡(jiǎn)單
只需要將空間釋放
并且將各個(gè)指針置為空就行了

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

3.4 vector的拷貝構(gòu)造函數(shù)

拷貝構(gòu)造的實(shí)現(xiàn)有很多種寫法
大家可以先自己嘗試一下

vector(const vector<T>& v)
	:_start(nullptr)
	, _finish(nullptr)
	, _endof_storage(nullptr)
	{
		reserve(v.size());
		for (const auto& e : v)
		{
			push_back(e);
		}
	}

4. 總結(jié)以及拓展

vector模擬實(shí)現(xiàn)的全部代碼我將在
下一篇文章中分享給大家

可以發(fā)現(xiàn):STL的神奇之處在于
它把所有接口函數(shù)都做了統(tǒng)一化處理
每一個(gè)容器的接口函數(shù)的使用都相似
但是內(nèi)部實(shí)現(xiàn)被這種封裝隱藏起來(lái)了
進(jìn)一步又體現(xiàn)了C++的三大特性:
封裝

并且C++實(shí)現(xiàn)了所有容器通用的算法庫(kù)
比如sort和find都只需要傳迭代器
然而所有容器都會(huì)被迭代器封裝
所以一份代碼就能實(shí)現(xiàn)對(duì)不同容器的操作

【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn),C++從入門到精通,c++,java,開發(fā)語(yǔ)言

拓展題目:

熟悉了vector的基本使用
可以嘗試解決一下下面幾個(gè)問題:

  • 只出現(xiàn)一次的數(shù)字
  • 刪除有序數(shù)組中的重復(fù)項(xiàng)
  • 數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字
  • 楊輝三角

留給大家當(dāng)作小試牛刀了~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-679111.html


?? 下期預(yù)告:迭代器失效和深淺拷貝問題 ??

到了這里,關(guān)于【C++進(jìn)階(二)】STL大法--vector的深度剖析以及模擬實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】STL——vector 深度剖析 及 模擬實(shí)現(xiàn)

    【C++】STL——vector 深度剖析 及 模擬實(shí)現(xiàn)

    這篇文章我們來(lái)學(xué)習(xí)一下STL里面的vector,它屬于STL中容器的一員,我們先來(lái)學(xué)習(xí)一下它的使用,然后,我們也會(huì)對(duì)vector進(jìn)行一個(gè)深度的剖析和模擬實(shí)現(xiàn)。 1.1 vector的介紹 vector的文檔介紹 vector 是表示大小可以更改的數(shù)組的序列容器: 其實(shí)大家可以認(rèn)為 vector就是我們之前數(shù)據(jù)結(jié)

    2024年02月05日
    瀏覽(19)
  • 【C++】透過STL源碼深度剖析及模擬實(shí)現(xiàn)vector

    【C++】透過STL源碼深度剖析及模擬實(shí)現(xiàn)vector

    鑒于讀者的響應(yīng),打算將文章拆分一下,方便觀看,基本接口可看 深入淺出STL之vector類 以下我所介紹的都是基于【SGI】版本的STL,對(duì)源碼有興趣的同學(xué)可以去看看 侯捷老師的《STL源碼剖析》 然后呢我們就去調(diào)出【vector】的一些核心源碼,這里我們主要關(guān)注的就是這個(gè)使用原

    2024年02月14日
    瀏覽(30)
  • 【C++進(jìn)階(一)】STL大法以及string的使用

    【C++進(jìn)階(一)】STL大法以及string的使用

    ??博主CSDN主頁(yè):杭電碼農(nóng)-NEO?? ? ?專欄分類:C++從入門到精通? ? ??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)C++ ? ???? 由于C語(yǔ)言的 標(biāo)準(zhǔn)庫(kù)不夠強(qiáng)大 沒有數(shù)據(jù)結(jié)構(gòu)和一些基本算法 什么都需要程序員自己實(shí)現(xiàn) 所以C語(yǔ)言在某種意義上并不實(shí)用 本章重點(diǎn): 本章會(huì)

    2024年02月11日
    瀏覽(25)
  • 【C++】:STL源碼剖析之vector類容器的底層模擬實(shí)現(xiàn)

    【C++】:STL源碼剖析之vector類容器的底層模擬實(shí)現(xiàn)

    構(gòu)造一個(gè)空vector size和capacity為0 將_start _finish _endofstorage 都置為空指針即可 傳統(tǒng)寫法 : 1). 新開辟一塊和 v 同樣容量的空間,更新 _start, _finish, _endofstorage 2). 將 v 中的數(shù)據(jù)拷貝到新開辟的空間中 注意 : 不要使用memcpy函數(shù)拷貝數(shù)據(jù),如果數(shù)據(jù)是內(nèi)置類型或淺拷貝的自定義類型

    2024年02月04日
    瀏覽(34)
  • 【C++從入門到放棄】vector深度剖析及模擬實(shí)現(xiàn)

    【C++從入門到放棄】vector深度剖析及模擬實(shí)現(xiàn)

    ?????作者: @情話0.0 ??專欄:《C++從入門到放棄》 ??個(gè)人簡(jiǎn)介:一名雙非編程菜鳥,在這里分享自己的編程學(xué)習(xí)筆記,歡迎大家的指正與點(diǎn)贊,謝謝! vector 是表示 可變大小數(shù)組 的序列容器。 就像數(shù)組一樣,vector也采用的 連續(xù)存儲(chǔ)空間 來(lái)存儲(chǔ)元素。也就是意味著可以

    2024年02月07日
    瀏覽(27)
  • 【C++】STL——list深度剖析 及 模擬實(shí)現(xiàn)

    【C++】STL——list深度剖析 及 模擬實(shí)現(xiàn)

    這篇文章我們來(lái)繼續(xù)STL的學(xué)習(xí),今天我們要學(xué)習(xí)的是list,也是STL中容器的一員。 和之前一樣,我們還是先學(xué)習(xí)它的使用,然后再對(duì)它進(jìn)行一個(gè)深度剖析和模擬實(shí)現(xiàn)。 1.1 list的介紹 list的文檔介紹 list的底層實(shí)現(xiàn)其實(shí)就是我們之前數(shù)據(jù)結(jié)構(gòu)學(xué)過的帶頭雙向循環(huán)鏈表: 1.2 list的使

    2024年02月05日
    瀏覽(21)
  • 【C++】STL之list深度剖析及模擬實(shí)現(xiàn)

    【C++】STL之list深度剖析及模擬實(shí)現(xiàn)

    目錄 前言 一、list 的使用 ?1、構(gòu)造函數(shù) 2、迭代器 3、增刪查改 4、其他函數(shù)使用 二、list 的模擬實(shí)現(xiàn) ?1、節(jié)點(diǎn)的創(chuàng)建 ?2、push_back 和 push_front ?3、普通迭代器 ?4、const 迭代器 ?5、增刪查改(insert、erase、pop_back、pop_front) ?6、構(gòu)造函數(shù)和析構(gòu)函數(shù) ? 6.1、默認(rèn)構(gòu)造 ? 6.2、構(gòu)造

    2024年02月07日
    瀏覽(33)
  • C++入門之stl六大組件--List源碼深度剖析及模擬實(shí)現(xiàn)

    C++入門之stl六大組件--List源碼深度剖析及模擬實(shí)現(xiàn)

    文章目錄 前言 一、List源碼閱讀 二、List常用接口模擬實(shí)現(xiàn) 1.定義一個(gè)list節(jié)點(diǎn) 2.實(shí)現(xiàn)一個(gè)迭代器 2.2const迭代器 3.定義一個(gè)鏈表,以及實(shí)現(xiàn)鏈表的常用接口 三、List和Vector 總結(jié) 本文中出現(xiàn)的模擬實(shí)現(xiàn)經(jīng)過本地vs測(cè)試無(wú)誤,文件已上傳gitee,地址:list: 模仿實(shí)現(xiàn)stl的list - Gitee.com 首

    2024年02月13日
    瀏覽(30)
  • C++入門之stl六大組件--stack和queue源碼深度剖析及模擬實(shí)現(xiàn)

    目錄 前言 一、stack的介紹和使用 1.stack的介紹 2.stack的使用 3.stack的模擬實(shí)現(xiàn) 二、queue的介紹和使用 1.queue的介紹 2.queue的使用 3.queue的模擬實(shí)現(xiàn) 三、priority_queue的介紹和使用 1.priority_queue的介紹 2.priority_queue的使用 3.priority_queue的模擬實(shí)現(xiàn) 3.1解決一個(gè)topK問題 四、容器適配器 1

    2024年02月14日
    瀏覽(22)
  • 【C++】:C++中的STL序列式容器vector源碼剖析

    【C++】:C++中的STL序列式容器vector源碼剖析

    vector定于與stl_vector.h頭文件中 例如: vector的數(shù)據(jù)結(jié)構(gòu)非常簡(jiǎn)單:一個(gè)線性連續(xù)空間 下面介紹vector的3個(gè)數(shù)據(jù)結(jié)構(gòu): start:表示目前使用空間的頭 finish:表示目前使用空間的尾 end_of_storage:表示目前可用空間的尾 說(shuō)明:為了降低空間配置時(shí)的速度成本,vector實(shí)際配置的大小可

    2024年01月22日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包