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

【C++】vector類的模擬實(shí)現(xiàn)(增刪查改,拷貝構(gòu)造,賦值運(yùn)算,深淺拷貝)

這篇具有很好參考價(jià)值的文章主要介紹了【C++】vector類的模擬實(shí)現(xiàn)(增刪查改,拷貝構(gòu)造,賦值運(yùn)算,深淺拷貝)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??博客主頁: 主頁
??系列專欄: C++
??感謝大家點(diǎn)贊??收藏?評(píng)論??
??期待與大家一起進(jìn)步!



前言

我們模擬vector是用迭代器(start,end,endofstorage)來控制增刪查改操作的

【C++】vector類的模擬實(shí)現(xiàn)(增刪查改,拷貝構(gòu)造,賦值運(yùn)算,深淺拷貝),c++,開發(fā)語言

一、 整體

1.命名空間:

namespace simulation {
	template<class T>//定義模板
	class vector {
	public:
		typedef T* iterator;
		typedef const T* const_iterator;
		//
		private:
		iterator _start;
		iterator _finish;
		iterator _endofstorage;
	};
	}

2構(gòu)造函數(shù):

1普通構(gòu)造

vector()
			:_start(nullptr)
			,_finish(nullptr)
			,_endofstorage(nullptr)
		{}

2迭代器構(gòu)造

template<class InputIterator>
		//【first,last)左閉右開區(qū)間
		vector(InputIterator first, InputIterator last) {
			while (first != last) {
				push_back(*first);
				first++;
			}
		}

3初始化字符構(gòu)造

vector(size_t n, const T& val = T()) {
//const T& val = T()調(diào)用T的默認(rèn)構(gòu)造的缺省參數(shù)
			resize(n, val);
		}

4拷貝構(gòu)造:

vector(const vector<T>& v) {
			_start = new T[v.capacity()];
			size_t sz = v.size();
			//提前記錄下size
			for (size_t i = 0; i < sz; i++) {
				_start[i] = v._start[i];//實(shí)行深拷貝
			}
			_finish = _start + sz;
			_endofstorage = _start + v.capacity();
		}

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

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

二、成員函數(shù)實(shí)現(xiàn)

1.大小

1當(dāng)前大小(size())

//我本身是一個(gè)const對(duì)象,不可變,所以就需要調(diào)用一個(gè)const函數(shù),
//但我要是一個(gè)非const對(duì)象,那么調(diào)用非const或者const函數(shù)是都都可以的
//這 成員函數(shù)加個(gè)const,這樣const和非const對(duì)象都就可以調(diào)用了
		size_t size()const    {
			return _finish - _start;
		}

2總體容量(capacity())

size_t capacity() const   {
			return _endofstorage - _start;
		}

2.返回頭尾迭代器

1begin()

       iterator begin() {
			return _start;
		}
		const_iterator begin()const {
			return _start;
		}

2end()

      iterator end() {
			return _finish;
		}
		const_iterator end()const {
			return _finish;
		}

3【】引用重載:

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

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

4.內(nèi)存預(yù)留(reserve)

	void reserve(size_t n) {
			if (n > capacity()) {
				T* tmp = new T[n];
				size_t sz = size();
		//提前存下size,因?yàn)楹竺鎠tart會(huì)變動(dòng)
				
				if (_start) {
					for (size_t i = 0; i < sz; i++) {
						tmp[i] = _start[i];
					}
//這里拷貝原來的數(shù)據(jù)不用memcpy是因?yàn)閙emcpy是淺拷貝我們vector要的是深拷貝
//所以用for循環(huán)調(diào)用賦值運(yùn)算符重載,實(shí)現(xiàn)對(duì)象的深拷貝
					delete[] _start;
				}
				_start = tmp;
				_finish = _start + sz;
				_endofstorage = _start + n;
			}
		}

5.調(diào)整vector的有效長(zhǎng)度(resize)

void resize(size_t n, const T& val = T()) {
			//將前n個(gè)數(shù)據(jù)初始化為val
			//從當(dāng)前已有數(shù)據(jù)后面開始
			if (n < size()) {
				_finish = _start + n;
				
			}
			else {
				reserve(n);
				while (_finish != _start+n) {
					*_finish = val;
					_finish++;
				}
			}
		}

6.尾插(push_back)

void push_back(const T& x) {
			if (_finish == _endofstorage) {
				//判斷是否需要擴(kuò)容
				size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;
				reserve(newcapacity);
			}
			*_finish = x;
			_finish++;
			//或者insert(--end());
		}

7.在pos插入(insert)

iterator insert(iterator pos, const T& x) {
			assert(pos >= _start && pos <= _finish);
			if (_finish == _endofstorage) {
				size_t len = pos - _start;
				//算出pos的相對(duì)位置
				size_t newcapacity = capacity() == 0 ? 4 : capacity()  
				reserve(newcapacity);
				pos = _start + len;
			}
			iterator end = _finish - 1;
			while (end >= pos) {
				*(end + 1) = *end;
				--end;
			}
			*pos = x;
			++_finish;
			return pos;
		}

8.刪除pos位置(erase)

iterator erase(iterator pos) {
			assert(pos >= _start && pos < _finish);
			iterator it = pos + 1;
			//將pos后面的數(shù)據(jù)朝前覆蓋
			while (it != _finish) {
				*(it - 1) = *it;
				++it;
			}
			_finish--;
			return pos;
		}

9.賦值運(yùn)算符重載

void swap(vector<T>& v) {
			std::swap(_start, v._start);
			std::swap(_finish, v._finish);
			std::swap(_endofstorage, v._endofstorage);
		}
		vector& operator=(vector<T>  v) {
			swap(v);
			//創(chuàng)建一個(gè)臨時(shí)對(duì)象,臨時(shí)對(duì)象為v的拷貝
			//交換this與v的數(shù)據(jù),出了作用域以后
			//this獲得新的數(shù)據(jù),臨時(shí)對(duì)象v出作用域銷毀
			return *this;
		}

深淺拷貝問題(reserve):

【C++】vector類的模擬實(shí)現(xiàn)(增刪查改,拷貝構(gòu)造,賦值運(yùn)算,深淺拷貝),c++,開發(fā)語言

【C++】vector類的模擬實(shí)現(xiàn)(增刪查改,拷貝構(gòu)造,賦值運(yùn)算,深淺拷貝),c++,開發(fā)語言
【C++】vector類的模擬實(shí)現(xiàn)(增刪查改,拷貝構(gòu)造,賦值運(yùn)算,深淺拷貝),c++,開發(fā)語言
【C++】vector類的模擬實(shí)現(xiàn)(增刪查改,拷貝構(gòu)造,賦值運(yùn)算,深淺拷貝),c++,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-606490.html

到了這里,關(guān)于【C++】vector類的模擬實(shí)現(xiàn)(增刪查改,拷貝構(gòu)造,賦值運(yùn)算,深淺拷貝)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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++:list增刪查改模擬實(shí)現(xiàn)

    C++:list增刪查改模擬實(shí)現(xiàn)

    本篇博客采用SGI版本,同時(shí)考慮到看到此篇博客大部分為初學(xué)者,為此博主僅僅給出有用片段。 C++:list增刪查改模擬實(shí)現(xiàn)就是用C++復(fù)寫雙鏈表,非常簡(jiǎn)單。難點(diǎn)主要在迭代器實(shí)現(xiàn) list底層使用什么數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)的呢?我們先來看看SGI庫(kù)中l(wèi)ist的成員函數(shù)和初始化吧。 我們發(fā)現(xiàn)

    2024年02月04日
    瀏覽(19)
  • 【c++】vector的增刪查改

    【c++】vector的增刪查改

    為了防止和庫(kù)里面發(fā)生沖突,定義一個(gè)命名空間,將類對(duì)象放在命名空間 里面 1.返回指向順序表開始的迭代器函數(shù) 2.返回指向順序表結(jié)尾的迭代器函數(shù) 3.返回容量大小的函數(shù) 4.返回順序表元素多少 5.判斷順序表為空地的函數(shù) 5.一個(gè)運(yùn)算符重載的函數(shù)(返回給定下標(biāo)下的值)

    2024年02月20日
    瀏覽(19)
  • C++:stack、queue、priority_queue增刪查改模擬實(shí)現(xiàn)、deque底層原理

    C++:stack、queue、priority_queue增刪查改模擬實(shí)現(xiàn)、deque底層原理

    我們先來看看 stack的相關(guān)接口有哪些: 從棧的接口,我們可以知道棧的接口是一種特殊的vector,所以我們完全可以使用vector來模擬實(shí)現(xiàn)stack。 因此我們可以將底層容器定義成模板,然后將容器類變量作為成員變量進(jìn)行封裝。在實(shí)現(xiàn)satck的各種接口時(shí),通過成員變量來調(diào)用底層

    2024年02月03日
    瀏覽(24)
  • C++初階-vector類的模擬實(shí)現(xiàn)

    C++初階-vector類的模擬實(shí)現(xiàn)

    C++ STL中的vector就類似于C語言當(dāng)中的數(shù)組,但是vector又擁有很多數(shù)組沒有的接口,使用起來更加方便。 相比于STL中的string,vector可以定義不同的數(shù)據(jù)類型。 迭代器的本質(zhì)可以暫時(shí)看作是指針,模擬實(shí)現(xiàn)vector,需要定義三個(gè)指針:指向起始位置_start,指向最后一個(gè)有效元素的下

    2024年02月04日
    瀏覽(19)
  • 【C++】:拷貝構(gòu)造函數(shù)與賦值運(yùn)算符重載的實(shí)例應(yīng)用之日期類的實(shí)現(xiàn)

    【C++】:拷貝構(gòu)造函數(shù)與賦值運(yùn)算符重載的實(shí)例應(yīng)用之日期類的實(shí)現(xiàn)

    ??日期類的實(shí)現(xiàn),將按以下聲明依次進(jìn)行,其中因?yàn)镻rint函數(shù)比較短,直接放到類里面讓其變成內(nèi)聯(lián)函數(shù) ??而我們實(shí)現(xiàn)日期類經(jīng)常要用到某月有多少天,在這里先把獲得某月有多少天的函數(shù)實(shí)現(xiàn)出來。實(shí)現(xiàn)時(shí)先檢查傳參有沒有問題,在注意把數(shù)組設(shè)置成靜態(tài)的,出了作用域

    2024年02月08日
    瀏覽(28)
  • 【C++練級(jí)之路】【Lv.7】【STL】vector類的模擬實(shí)現(xiàn)

    【C++練級(jí)之路】【Lv.7】【STL】vector類的模擬實(shí)現(xiàn)

    快樂的流暢:個(gè)人主頁 個(gè)人專欄:《C語言》《數(shù)據(jù)結(jié)構(gòu)世界》《進(jìn)擊的C++》 遠(yuǎn)方有一堆篝火,在為久候之人燃燒! 關(guān)于STL容器的學(xué)習(xí),我們來到了運(yùn)用 最廣泛、最常見的vector 。有了之前關(guān)于string的學(xué)習(xí),我們對(duì)容器設(shè)計(jì)有了一個(gè)大概的了解,而今天在熟悉的基礎(chǔ)上去探求

    2024年01月24日
    瀏覽(35)
  • 【C++技能樹】類的六個(gè)成員函數(shù)Ⅰ --構(gòu)造、析構(gòu)、拷貝構(gòu)造函數(shù)

    【C++技能樹】類的六個(gè)成員函數(shù)Ⅰ --構(gòu)造、析構(gòu)、拷貝構(gòu)造函數(shù)

    Halo,這里是Ppeua。平時(shí)主要更新C語言,C++,數(shù)據(jù)結(jié)構(gòu)算法…感興趣就關(guān)注我吧!你定不會(huì)失望。 在開始本章內(nèi)容之前,先淺淺的了解一下this指針的概念.這對(duì)理解后面的內(nèi)容有著很大的幫助. this指針 顧名思義就是這個(gè)指針,我們先來看看下面這段很簡(jiǎn)單的代碼 首先創(chuàng)建了一個(gè)

    2024年02月02日
    瀏覽(29)
  • C++中類的6個(gè)默認(rèn)成員函數(shù) 【拷貝構(gòu)造函數(shù)】

    C++中類的6個(gè)默認(rèn)成員函數(shù) 【拷貝構(gòu)造函數(shù)】

    在前幾章學(xué)習(xí)對(duì)象的時(shí)候,我們有的時(shí)候需要一個(gè)與已存在對(duì)象一某一樣的新對(duì)象 那在創(chuàng)建對(duì)象時(shí),可否創(chuàng)建一個(gè)與已存在對(duì)象一某一樣的新對(duì)象呢? 拷貝構(gòu)造函數(shù):只有單個(gè)形參,該形參是對(duì)本類類型對(duì)象的引用(一般常用const修飾),在用已存在的類類型對(duì)象創(chuàng)建新對(duì)象時(shí)

    2024年02月20日
    瀏覽(25)
  • [C++] string類的介紹與構(gòu)造的模擬實(shí)現(xiàn),進(jìn)來看吧,里面有空調(diào)

    [C++] string類的介紹與構(gòu)造的模擬實(shí)現(xiàn),進(jìn)來看吧,里面有空調(diào)

    C語言中,字符串是以’\\0’結(jié)尾的一些字符的集合,為了操作方便,C標(biāo)準(zhǔn)庫(kù)中提供了一些str系列的庫(kù)函數(shù),但是這些庫(kù)函數(shù)與字符串是分離開的,不太符合面向?qū)ο蟮乃枷耄业讓涌臻g需要用戶自己管理,稍不留神可能還會(huì)越界訪問。 因此C++中,為了讓我們更簡(jiǎn)單、方便

    2024年02月12日
    瀏覽(19)
  • C++_String增刪查改模擬實(shí)現(xiàn)

    C++_String增刪查改模擬實(shí)現(xiàn)

    本篇博客僅僅實(shí)現(xiàn)存儲(chǔ)字符的string。同時(shí)由于C++string庫(kù)設(shè)計(jì)的不合理,博主僅實(shí)現(xiàn)一些最常見的增刪查改接口! 接下來給出的接口都是基于以下框架: 博主在這僅僅提供如 無參和帶參默認(rèn)構(gòu)造 接口: 小tips: C++string標(biāo)準(zhǔn)庫(kù)中,無參構(gòu)造并不是空間為0,直接置為空指針。而

    2024年02月04日
    瀏覽(16)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包