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

C++ STL vector 模擬實現(xiàn)

這篇具有很好參考價值的文章主要介紹了C++ STL vector 模擬實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?<1>主頁:我的代碼愛吃辣
??<2>知識講解:C++之STL
??<3>創(chuàng)作者:我的代碼愛吃辣
??<4>開發(fā)環(huán)境:Visual Studio 2022
??<5>前言:上次我們已經(jīng)數(shù)字會用了vector,這次我們對其底層更深一步挖掘,其中重點是,Vector中一些深淺拷貝問題。

目錄

一.Vector模擬實現(xiàn)的整體框架

二. Vector的構(gòu)造與析構(gòu)

三.size(),capacity()

?四.reserve(),resize()

1.reserve()

2.resize

五.push_back(),pop_back()

1.push_back()

2. pop_back()

六.Vector的迭代器

?七.operator [ ]

?八.insert(),erase()

1.迭代器失效

2.insert()

3.erase()

九.再看Vector構(gòu)造函數(shù)

十.拷貝構(gòu)造

1.深淺拷貝

2.正確的拷貝構(gòu)造代碼:

3.正確的 reserve()

4.賦值運算符重載

十一.總體代碼


一.Vector模擬實現(xiàn)的整體框架

我們先認(rèn)識一下Vector的整體模擬實現(xiàn)框架,Vector在功能上就是我們數(shù)據(jù)結(jié)構(gòu)階段實現(xiàn)的順序表基本一致,但是Vector在成員框架上與順序表有所不同,且Vector使用類和對象封裝支持模板泛型。

template<class T>
class Vector
{
public:
    //迭代器類型
	typedef T* iterator;
	typedef const T* const_iterator;

    //...

private:
	iterator _start;//數(shù)據(jù)存儲首地址
	iterator _finish;//有效數(shù)據(jù)尾部地址下一個地址。
	iterator _end_of_storage;//容量尾地址下一個地址
};

Vector的迭代器是對順序表原生類型指針的封裝。

二. Vector的構(gòu)造與析構(gòu)

Vector主要是對成員變量初始化:

	Vector()
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
	}

析構(gòu)主要釋放我們申請的空間:

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

三.size(),capacity()

size()返回當(dāng)前順序表存儲的數(shù)據(jù)個數(shù),capacity()返回當(dāng)前順序表的容量。

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

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

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

?四.reserve(),resize()

1.reserve()

設(shè)置Vector的容量,注意容量支持增加,但是不支持減小。

void reserve(size_t capa)
	{
		//僅支持容量擴(kuò)大,不支持容量減小
		if (capacity() < capa)
		{
			size_t sz = size();
			iterator tmp = new T[capa];
			//分清當(dāng)前的是否已經(jīng)有了容量,如果已經(jīng)有了容量需要釋放之前的容量,
			//如果之前沒有容量僅需,將新開的空間指向我們的_start.
			if (_start)
			{
				memcpy(tmp, _start, sizeof(T) * capacity()); /*error ??!*/
				delete[] _start;
			}
			//注意:此處不能直接tmp+size()來計算,因為在計算_start的時候已經(jīng)已經(jīng)改變了_start,
			//然后計算的size也并非是,準(zhǔn)確的size。
			_start = tmp;
			_finish = tmp + sz;
			_end_of_storage = _start + capa;
		}
	}

注意:

此處不能直接tmp+size()來計算,因為在計算_start的時候已經(jīng)已經(jīng)改變了_start,然后計算的size也并非是,準(zhǔn)確的size。除此之外這份代碼依舊是有問題的。我們后面解釋。

錯誤代碼如下:

    void reserve(size_t capa)
    {
		if (capacity() < capa)
		{
			iterator tmp = new T[capa];
			if (_start)
			{
				memcpy(tmp, _start, sizeof(T) * capacity());
				delete[] _start;
			}
			//注意:此處不能直接tmp+size()來計算,因為在計算_start的時候已經(jīng)已經(jīng)改變了_start,
			//然后計算的size也并非是,準(zhǔn)確的size。
			_start = tmp;
			_finish = tmp + size();
			_end_of_storage = _start + capa;
		}
	}

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

2.resize

提供改變存儲數(shù)據(jù)的個數(shù)的能力。如果 n < size 時就是刪除數(shù)據(jù),n > size且空間不夠時需要擴(kuò)容+初始化,空間足夠,僅需要初始化剩下的空間。

    void resize(size_t n, T val = T())
	{	
		//1.n < size;-->刪除數(shù)據(jù)
		if (n < size())
		{
			_finish = _start + n;
		}
		//2.n > size
		else 
		{
			//(1)如果空間不足,需要擴(kuò)容+初始化
			if (n >= capacity())
			{
				reserve(n);
			}
			//(2)空間足夠,僅需要初始化剩下的空間
			while (_finish != _start + n)
			{
				*(_finish) = val;
				_finish++;
			}
		}
	}

五.push_back(),pop_back()

1.push_back()

從尾部插入一個數(shù)據(jù)。

	void push_back(const T& val)
	{
        //檢查是否需要擴(kuò)容
		if (_finish == _end_of_storage)
		{
			capacity() == 0 ? reserve(5) : reserve(capacity() * 2);
		}
        //插入數(shù)據(jù)
		*(_finish) = val;
		_finish++;
	}

2. pop_back()

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

	void pop_back()
	{
		//判空
		assert(!empty());
		//我們僅需將維護(hù)尾部數(shù)據(jù)的指針向前挪一位。
		_finish--;
	}

六.Vector的迭代器

	typedef T* iterator;
	typedef const T* const_iterator;

Vector底層就是順序存儲的結(jié)構(gòu),所以可以使用原生指針作為迭代器。

	//普通迭代器
	iterator begin()
	{
		return _start;
	}
	iterator end()
	{
		return _finish;
	}

	//const 迭代器
	const_iterator begin()const 
	{
		return _start;
	}
	const_iterator end()const
	{
		return _finish;
	}

有了迭代器就可以支持迭代器訪問,和范圍for。

int main()
{
	Vector<int> v1;
	v1.push_back(100);
	v1.push_back(200);
	v1.push_back(300);
	v1.push_back(400);
	v1.push_back(500);
	v1.push_back(600);
	v1.push_back(700);

	Vector<int>::iterator it = v1.begin();
	while (it != v1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	for (auto e : v1)
	{
		cout << e << " ";
	}

	return 0;
}

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

?七.operator [ ]

	//穿引用返回
	T& operator[](size_t pos)
	{
		//判斷位置的合法性
		assert(pos < size());
		return _start[pos];
	}

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

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

?八.insert(),erase()

1.迭代器失效

在模擬實現(xiàn)之前我們先看一下什么是迭代器失效問題:

迭代器失效問題通常發(fā)生在容器類的成員函數(shù)中,例如erase和insert。在這些函數(shù)中,迭代器被重置或修改,導(dǎo)致原始迭代器不再指向容器的正確位置,從而導(dǎo)致迭代器失效。

int main()
{
	vector<int> v1;
	v1.push_back(100);
	v1.push_back(200);
	v1.push_back(300);
	v1.push_back(400);
	v1.push_back(500);
	v1.push_back(600);
	v1.push_back(700);  
	vector<int>::iterator pos = find(v1.begin(), v1.end(),200);
	//對pos位置插入
	v1.insert(pos, 150);
	//pos已經(jīng)失效
	v1.insert(pos, 170);
 
      return 0;
}

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

原理圖:

情況一:

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

?上述代碼中的迭代器失效問題也是屬于這種情況。

情況二:

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

2.insert()

    iterator insert(iterator pos,T val)
	{
		assert(pos >= _start);
		assert(pos < _finish);
		//迭代器失效問題,記錄pos的相對位置
		int len = pos - _start;
		if (_finish == _end_of_storage)
		{
			capacity() == 0 ? reserve(5) : reserve(capacity() * 2);
		}
		//擴(kuò)容后重新計算pos,沒有發(fā)生擴(kuò)容pos不變
		pos = _start + len;
		iterator end = _finish;
		//數(shù)據(jù)挪動
		while (end >= pos)
		{
			(*end) = *(end - 1);
			end--;
		}
		_finish++;
		(*pos) = val;
		return pos;
	}

在使用pos時要注意擴(kuò)容會使得pos失效,需要重新計算pos位置。

3.erase()

	iterator erase(iterator pos)
	{
        //判斷位置是否合法
		assert(pos >= _start);
		assert(pos < _finish);
		iterator end = pos ;
        /挪動數(shù)據(jù)刪除
		while (end < _finish)
		{
			*end = *(end + 1);
			end++;
		}
		_finish--;
		return pos;
	}

九.再看Vector構(gòu)造函數(shù)

std中的vector還支持使用指定個數(shù)和初始化值初始化,和迭代器區(qū)間初始化。這兩個功能在我們平時也是能用到的。

    //1.Vector<T> v(5,10);創(chuàng)建一個Vector并且初始化前5個值為10
	Vector(size_t n, const T& val = T())
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		reserve(n);
		for (int i = 0; i < n; i++)
		{
			push_back(val);
		}
	}

	//2.迭代器初始化,[frist,lest)
	template<class InputIterator>
	Vector(InputIterator frist, InputIterator lest)
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		reserve(lest - frist);
		while (frist != lest)
		{
			push_back(*frist);
			frist++;
		}
	}

	//3.防止構(gòu)造函數(shù)調(diào)用錯誤
	Vector(int n, const T& val = T())
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		reserve(n);
		for (int i = 0; i < n; i++)
		{
			push_back(val);
		}
	}

第三個構(gòu)造函數(shù)的作用是防止構(gòu)造調(diào)用錯誤沖突,在我們進(jìn)行如下的調(diào)用時:

Vector<int> v2(5, 10);

編譯器會以為我們在調(diào)用迭代器區(qū)間初始化構(gòu)造函數(shù),因為經(jīng)過模板的推導(dǎo),只有迭代器區(qū)間初始化構(gòu)造函數(shù),更適合這個調(diào)用。然后將一個整形當(dāng)作地址在迭代器區(qū)間初始化構(gòu)造函數(shù)里面解引用了,報錯是:非法的間接尋址。

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

?正常調(diào)用結(jié)果:C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

十.拷貝構(gòu)造

今天這里編譯器默認(rèn)生成的拷貝構(gòu)造顯然是不能用了。

1.深淺拷貝

萬萬不可以直接使用拷貝函數(shù)按二進(jìn)制或者按字節(jié)直接拷貝了。

錯誤代碼1:

	Vector(const Vector<T>& v)
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
        reserve(v.capacity());
		//萬萬不可以直接按二進(jìn)制拷貝
		memcpy(_start, v._start, sizeof(T) * v.capacity()); /*error!!!!*/
		_finish = _start + v.size();
		_end_of_storage = _start + v.capacity();
	}

原因:

調(diào)用處代碼:


int main()
{
	string str("abcdefg");
	Vector<string> v2(5,str);
	Vector<string> v3(v2);
	return 0;
}

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

?會使得我們同一塊空間被delete兩次從而引發(fā)內(nèi)存錯誤。

2.正確的拷貝構(gòu)造代碼:

	Vector(const Vector<T>& v)
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		reserve(v.capacity());
		//這里我們將數(shù)據(jù)一個一個push進(jìn)去,這樣我們借助push_back底層插入的時候,
		//會使用string的賦值構(gòu)造,完成深拷貝。
		for (int i = 0; i < v.size(); i++)
		{
			push_back(v[i]);
		}
	}
    //現(xiàn)代寫法
	Vector(const Vector<T>& v)
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		Vector<T> tmp(v.begin(), v.end());
		swap(tmp);
	}

錯誤代碼2:reserve()

	void reserve(size_t capa)
	{
		//僅支持容量擴(kuò)大,不支持容量減小
		if (capacity() < capa)
		{
			size_t sz = size();
			iterator tmp = new T[capa];
			//分清當(dāng)前的是否已經(jīng)有了容量,如果已經(jīng)有了容量需要釋放之前的容量,
			//如果之前沒有容量僅需,將新開的空間指向我們的_start.
			if (_start)
			{
				//這里千萬不能按二進(jìn)制直接拷貝.
				memcpy(tmp, _start, sizeof(T) * capacity());   /*error ??!*/
				delete[] _start;
			}
			//注意:此處不能直接tmp+size()來計算,因為在計算_start的時候已經(jīng)已經(jīng)改變了_start,
			//然后計算的size也并非是,準(zhǔn)確的size。
			_start = tmp;
			_finish = tmp + sz;
			_end_of_storage = _start + capa;
		}
	}

這里我們?nèi)匀皇鞘褂昧薽emcpy。

調(diào)用處代碼:

int main()
{

	string str("abcdefg");
	Vector<string> v2;
	for (int i = 0; i < 6; i++)
	{
		v2.push_back(str);
	}

	return 0;
}

C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)

3.正確的 reserve()

void reserve(size_t capa)
	{
		//僅支持容量擴(kuò)大,不支持容量減小
		if (capacity() < capa)
		{
			size_t sz = size();
			iterator tmp = new T[capa];
			//分清當(dāng)前的是否已經(jīng)有了容量,如果已經(jīng)有了容量需要釋放之前的容量,
			//如果之前沒有容量僅需,將新開的空間指向我們的_start.
			if (_start)
			{
				//這里千萬不能按二進(jìn)制直接拷貝.
				//memcpy(tmp, _start, sizeof(T) * capacity());   /*ror !!*/
				for (int i = 0; i < size(); i++)
				{
                    //=內(nèi)置類型直接賦值,自定義類型使用賦值構(gòu)造
					tmp[i]=_start[i];
				}
				delete[] _start;
			}
			//注意:此處不能直接tmp+size()來計算,因為在計算_start的時候已經(jīng)已經(jīng)改變了_start,
			//然后計算的size也并非是,準(zhǔn)確的size。
			_start = tmp;
			_finish = tmp + sz;
			_end_of_storage = _start + capa;
		}
	}

這里有一個細(xì)節(jié)就是在reserve和拷貝構(gòu)造的拷貝數(shù)據(jù)的時候我們都是使用了賦值。問題我們并沒有重載賦值運算符,編譯器自動生成,簡單來說就是這里又會是一個淺拷貝。

4.賦值運算符重載

    //傳統(tǒng)寫法
    Vector<T>& operator=(const Vector<T>& v)
	{
		T* tmp = new T[v.capacity()];
		if (_start)
		{
			for (int i = 0; i < v.size(); i++)
			{
				tmp[i] = _start[i];
			}
			delete[] _start;
		}
		_start = tmp;
		_finish = _start + v.size();
		_end_of_storage = _start + v.capacity();
		
		return *this;
	}

    //現(xiàn)代寫法
	void swap(Vector<T>& v )
	{
		std::swap(v._start, _start);
		std::swap(v._finish, _finish);
		std::swap(v._end_of_storage, _end_of_storage);
	}
    
	Vector<T>& operator=(Vector<T> v)
	{
		swap(v);
		return *this;
	}

現(xiàn)代寫法利用,拷貝構(gòu)造拷貝出來的對象,然后交換對象的成員。

十一.總體代碼

#pragma once
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cassert>
using namespace std;

template<class T>
class Vector
{
public:
	typedef T* iterator;
	typedef const T* const_iterator;
	Vector()
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
	}

	//1.Vector<T> v(5,10);創(chuàng)建一個Vector并且初始化前5個值為10
	Vector(size_t n, const T& val = T())
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		reserve(n);
		for (int i = 0; i < n; i++)
		{
			push_back(val);
		}
	}

	//2.迭代器初始化,[frist,lest)
	template<class InputIterator>
	Vector(InputIterator frist, InputIterator lest)
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		reserve(lest - frist);
		while (frist != lest)
		{
			push_back(*frist);
			frist++;
		}
	}

	//3.防止構(gòu)造函數(shù)調(diào)用沖突
	Vector(int n, const T& val = T())
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		reserve(n);
		for (int i = 0; i < n; i++)
		{
			push_back(val);
		}
	}

	//傳統(tǒng)寫法 拷貝構(gòu)造
	//Vector(const Vector<T>& v)
	//	:_start(nullptr),
	//	_finish(nullptr),
	//	_end_of_storage(nullptr)
	//{
	//	reserve(v.capacity());
	//	//這里我們將數(shù)據(jù)一個一個push進(jìn)去,這樣我們借助push_back底層插入的時候,
	//	//會使用string的賦值構(gòu)造,完成深拷貝。
	//	for (int i = 0; i < v.size(); i++)
	//	{
	//		_start[i] = v[i];
	//	}
	//}
	//現(xiàn)代寫法,拷貝構(gòu)造
	Vector(const Vector<T>& v)
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		Vector<T> tmp(v.begin(), v.end());
		swap(tmp);
	}

	//傳統(tǒng)寫法,賦值拷貝
	//Vector<T>& operator=(const Vector<T>& v)
	//{
	//	T* tmp = new T[v.capacity()];
	//	if (_start)
	//	{
	//		for (int i = 0; i < v.size(); i++)
	//		{
	//			tmp[i] = _start[i];
	//		}
	//		delete[] _start;
	//	}
	//	_start = tmp;
	//	_finish = _start + v.size();
	//	_end_of_storage = _start + v.capacity();
	//	
	//	return *this;
	//}
	

	void swap(Vector<T>& v )
	{
		std::swap(v._start, _start);
		std::swap(v._finish, _finish);
		std::swap(v._end_of_storage, _end_of_storage);
	}

	//現(xiàn)代寫法,賦值拷貝
	Vector<T>& operator=(Vector<T> v)
	{
		swap(v);
		return *this;
	}


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

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

	void reserve(size_t capa)
	{
		//僅支持容量擴(kuò)大,不支持容量減小
		if (capacity() < capa)
		{
			size_t sz = size();
			iterator tmp = new T[capa];
			//分清當(dāng)前的是否已經(jīng)有了容量,如果已經(jīng)有了容量需要釋放之前的容量,
			//如果之前沒有容量僅需,將新開的空間指向我們的_start.
			if (_start)
			{
				//這里千萬不能按二進(jìn)制直接拷貝.
				//memcpy(tmp, _start, sizeof(T) * capacity());   /*ror ?。?/
				for (int i = 0; i < size(); i++)
				{
					//=內(nèi)置類型直接賦值,自定義類型使用賦值構(gòu)造
					tmp[i]=_start[i];
				}
				delete[] _start;
			}
			//注意:此處不能直接tmp+size()來計算,因為在計算_start的時候已經(jīng)已經(jīng)改變了_start,
			//然后計算的size也并非是,準(zhǔn)確的size。
			_start = tmp;
			_finish = tmp + sz;
			_end_of_storage = _start + capa;
		}
	}

	void resize(size_t n, T val = T())
	{	
		//1.n < size;-->刪除數(shù)據(jù)
		if (n < size())
		{
			_finish = _start + n;
		}
		//2.n > size
		else 
		{
			//(1)如果空間不足,需要擴(kuò)容+初始化
			if (n >= capacity())
			{
				reserve(n);
			}
			//(2)空間足夠,僅需要初始化剩下的空間
			while (_finish != _start + n)
			{
				*(_finish) = val;
				_finish++;
			}
		}
	}
	//穿引用返回
	T& operator[](size_t pos)
	{
		//判斷位置的合法性
		assert(pos < size());
		return _start[pos];
	}

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

	void push_back(const T& val)
	{
		if (_finish == _end_of_storage)
		{
			capacity() == 0 ? reserve(5) : reserve(capacity() * 2);
		}
		//內(nèi)置類型直接賦值,自定義類型使用賦值構(gòu)造
		*(_finish) = val;
		_finish++;
	}

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

	void pop_back()
	{
		//判空
		assert(!empty());
		//我們僅需將維護(hù)尾部數(shù)據(jù)的指針向前挪一位。
		_finish--;
	}

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

	iterator insert(iterator pos,T val)
	{
		assert(pos >= _start);
		assert(pos < _finish);
		//迭代器失效問題,記錄pos的相對位置
		int len = pos - _start;
		if (_finish == _end_of_storage)
		{
			capacity() == 0 ? reserve(5) : reserve(capacity() * 2);
		}
		//擴(kuò)容后重新計算pos,沒有發(fā)生擴(kuò)容pos不變
		pos = _start + len;
		iterator end = _finish;
		//數(shù)據(jù)挪動
		while (end >= pos)
		{
			(*end) = *(end - 1);
			end--;
		}
		_finish++;
		(*pos) = val;
		return pos;
	}

	//普通迭代器
	iterator begin()
	{
		return _start;
	}
	iterator end()
	{
		return _finish;
	}

	//const 迭代器
	const_iterator begin()const 
	{
		return _start;
	}
	const_iterator end()const
	{
		return _finish;
	}

	~Vector()
	{
		delete[] _start;
		_start = _finish = _end_of_storage = nullptr;
	}
private:
	iterator _start;//數(shù)據(jù)存儲首地址
	iterator _finish;//有效數(shù)據(jù)尾部地址下一個地址。
	iterator _end_of_storage;//容量尾地址下一個地址
	int tmp;
};




?C++ STL vector 模擬實現(xiàn),C++,c++,數(shù)據(jù)結(jié)構(gòu)文章來源地址http://www.zghlxwxcb.cn/news/detail-645368.html

到了這里,關(guān)于C++ STL vector 模擬實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【C++】STL 模擬實現(xiàn)之 vector

    【C++】STL 模擬實現(xiàn)之 vector

    vector 是我們學(xué)習(xí)的第一個真正的 STL 容器,它接口的使用方式和 string 有一點點的不同,但大部分都是一樣的,所以這里我們就只演示其中一些接口的使用,大家如果有疑惑的地方直接在 cplusplus 是上面查看對應(yīng)的文檔即可。 vector 提供了四種構(gòu)造方式 – 無參構(gòu)造、n 個 val 構(gòu)

    2023年04月27日
    瀏覽(30)
  • C++ —— STL容器【vector】模擬實現(xiàn)

    C++ —— STL容器【vector】模擬實現(xiàn)

    本章代碼gitee倉庫:vector模擬實現(xiàn)、vector源碼 看源碼發(fā)現(xiàn) vector 是類模板定義的,成員是采用迭代器進(jìn)行管理 當(dāng)涉及到容器類時,通常有一些關(guān)鍵函數(shù),如構(gòu)造函數(shù)、析構(gòu)函數(shù)和拷貝構(gòu)造函數(shù),它們負(fù)責(zé)初始化容器對象、銷毀對象和進(jìn)行對象的拷貝等 這里注意拷貝構(gòu)造要實現(xiàn)

    2024年02月16日
    瀏覽(19)
  • STL 關(guān)于vector的細(xì)節(jié),vector模擬實現(xiàn)【C++】

    STL 關(guān)于vector的細(xì)節(jié),vector模擬實現(xiàn)【C++】

    _start指向容器的頭,_finish指向容器當(dāng)中 有效數(shù)據(jù) 的下一個位置,_endofstorage指向整個容器的尾 先開辟一塊與該容器大小相同的空間,然后將該容器當(dāng)中的數(shù)據(jù)一個個拷貝過來即可,最后更新_finish和_endofstorage的值即可。 深拷貝版本一: 注意: 不能使用memcpy函數(shù) , 如果vec

    2024年02月15日
    瀏覽(34)
  • 【c++】:STL中vector的模擬使用及模擬實現(xiàn)

    【c++】:STL中vector的模擬使用及模擬實現(xiàn)

    ? ? 文章目錄 前言 一.使用庫中vector常用接口 二.vector的模擬實現(xiàn) 總結(jié) ? 上一篇我們講解了STL中的string的使用和模擬實現(xiàn),這次我們就來講解STL中的vector,vector相對于string來說模擬實現(xiàn)會難一些,難點在于迭代器失效問題和深淺拷貝問題。 首先介紹一下vector: 1. vector是表示

    2024年01月21日
    瀏覽(28)
  • C++ stl容器vector的底層模擬實現(xiàn)

    C++ stl容器vector的底層模擬實現(xiàn)

    目錄 前言:?? 1.成員變量,容量與大小 2.構(gòu)造函數(shù) 無參構(gòu)造: 帶參的使用值進(jìn)行構(gòu)造: ?使用迭代器區(qū)間進(jìn)行構(gòu)造: 3.交換 4.拷貝構(gòu)造 5.賦值重載 6.迭代器 7.擴(kuò)容 reserve: resize: 8.插入與刪除 insert: erase: insert迭代器失效問題: erase迭代器失效問題: 9.頭插頭刪 10.[]重載

    2024年04月15日
    瀏覽(29)
  • C++ STL學(xué)習(xí)之【vector的模擬實現(xiàn)】

    C++ STL學(xué)習(xí)之【vector的模擬實現(xiàn)】

    ?個人主頁: 北 海 ??所屬專欄: C++修行之路 ??每篇一句: 圖片來源 The power of imagination makes us infinite. 想象力的力量使我們無限。 vector 是 STL 中的容器之一,其使用方法類似于數(shù)據(jù)結(jié)構(gòu)中的 順序表 ,得益于范型編程和 C++ 特性的加持, vector 更強(qiáng)大、更全能;在模擬實現(xiàn)

    2023年04月08日
    瀏覽(53)
  • 【C++】STL——vector 深度剖析 及 模擬實現(xiàn)

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

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

    2024年02月05日
    瀏覽(19)
  • 【C++】STL之vector功能及模擬實現(xiàn)

    【C++】STL之vector功能及模擬實現(xiàn)

    目錄 前沿 一、vector的使用 ?1、vector 構(gòu)造函數(shù)的聲明 ?2、vector 迭代器的使用 ?3、vector 空間增長問題 ?4、vector 的增刪查改 二、vector的模擬實現(xiàn) ?1、vector 的成員變量 ?2、迭代器 ?3、容量相關(guān)(resize, reserve) ?4、數(shù)據(jù)訪問相關(guān) ?5、插入刪除 ? 5.1 任意位置插入 ? 5.2 任意位置

    2024年02月16日
    瀏覽(14)
  • 【C++初階】STL詳解(四)vector的模擬實現(xiàn)

    【C++初階】STL詳解(四)vector的模擬實現(xiàn)

    本專欄內(nèi)容為:C++學(xué)習(xí)專欄,分為初階和進(jìn)階兩部分。 通過本專欄的深入學(xué)習(xí),你可以了解并掌握C++。 ??博主csdn個人主頁:小小unicorn ?專欄分類:C++ ??代碼倉庫:小小unicorn的代碼倉庫?? ??????關(guān)注我?guī)銓W(xué)習(xí)編程知識 注:為了防止與標(biāo)準(zhǔn)庫當(dāng)中的vector產(chǎn)生命名沖突

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

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

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

    2024年02月14日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包