C++ STL vector 模拟实现

这篇具有很好参考价值的文章主要介绍了C++ STL vector 模拟实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

✅<1>主页:我的代码爱吃辣
📃<2>知识讲解:C++之STL
🔥<3>创作者:我的代码爱吃辣
☂️<4>开发环境:Visual Studio 2022
💬<5>前言:上次我们已经数字会用了vector,这次我们对其底层更深一步挖掘,其中重点是,Vector中一些深浅拷贝问题。

目录

一.Vector模拟实现的整体框架

二. Vector的构造与析构

三.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构造函数

十.拷贝构造

1.深浅拷贝

2.正确的拷贝构造代码:

3.正确的 reserve()

4.赋值运算符重载

十一.总体代码


一.Vector模拟实现的整体框架

我们先认识一下Vector的整体模拟实现框架,Vector在功能上就是我们数据结构阶段实现的顺序表基本一致,但是Vector在成员框架上与顺序表有所不同,且Vector使用类和对象封装支持模板泛型。

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

    //...

private:
	iterator _start;//数据存储首地址
	iterator _finish;//有效数据尾部地址下一个地址。
	iterator _end_of_storage;//容量尾地址下一个地址
};

Vector的迭代器是对顺序表原生类型指针的封装。

二. Vector的构造与析构

Vector主要是对成员变量初始化:

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

析构主要释放我们申请的空间:

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

三.size(),capacity()

size()返回当前顺序表存储的数据个数,capacity()返回当前顺序表的容量。

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

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

C++ STL vector 模拟实现,C++,c++,数据结构

 四.reserve(),resize()

1.reserve()

设置Vector的容量,注意容量支持增加,但是不支持减小。

void reserve(size_t capa)
	{
		//仅支持容量扩大,不支持容量减小
		if (capacity() < capa)
		{
			size_t sz = size();
			iterator tmp = new T[capa];
			//分清当前的是否已经有了容量,如果已经有了容量需要释放之前的容量,
			//如果之前没有容量仅需,将新开的空间指向我们的_start.
			if (_start)
			{
				memcpy(tmp, _start, sizeof(T) * capacity()); /*error !!*/
				delete[] _start;
			}
			//注意:此处不能直接tmp+size()来计算,因为在计算_start的时候已经已经改变了_start,
			//然后计算的size也并非是,准确的size。
			_start = tmp;
			_finish = tmp + sz;
			_end_of_storage = _start + capa;
		}
	}

注意:

此处不能直接tmp+size()来计算,因为在计算_start的时候已经已经改变了_start,然后计算的size也并非是,准确的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的时候已经已经改变了_start,
			//然后计算的size也并非是,准确的size。
			_start = tmp;
			_finish = tmp + size();
			_end_of_storage = _start + capa;
		}
	}

C++ STL vector 模拟实现,C++,c++,数据结构

2.resize

提供改变存储数据的个数的能力。如果 n < size 时就是删除数据,n > size且空间不够时需要扩容+初始化,空间足够,仅需要初始化剩下的空间。

    void resize(size_t n, T val = T())
	{	
		//1.n < size;-->删除数据
		if (n < size())
		{
			_finish = _start + n;
		}
		//2.n > size
		else 
		{
			//(1)如果空间不足,需要扩容+初始化
			if (n >= capacity())
			{
				reserve(n);
			}
			//(2)空间足够,仅需要初始化剩下的空间
			while (_finish != _start + n)
			{
				*(_finish) = val;
				_finish++;
			}
		}
	}

五.push_back(),pop_back()

1.push_back()

从尾部插入一个数据。

	void push_back(const T& val)
	{
        //检查是否需要扩容
		if (_finish == _end_of_storage)
		{
			capacity() == 0 ? reserve(5) : reserve(capacity() * 2);
		}
        //插入数据
		*(_finish) = val;
		_finish++;
	}

2. pop_back()

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

	void pop_back()
	{
		//判空
		assert(!empty());
		//我们仅需将维护尾部数据的指针向前挪一位。
		_finish--;
	}

六.Vector的迭代器

	typedef T* iterator;
	typedef const T* const_iterator;

Vector底层就是顺序存储的结构,所以可以使用原生指针作为迭代器。

	//普通迭代器
	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 模拟实现,C++,c++,数据结构

 七.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 模拟实现,C++,c++,数据结构

 八.insert(),erase()

1.迭代器失效

在模拟实现之前我们先看一下什么是迭代器失效问题:

迭代器失效问题通常发生在容器类的成员函数中,例如erase和insert。在这些函数中,迭代器被重置或修改,导致原始迭代器不再指向容器的正确位置,从而导致迭代器失效。

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已经失效
	v1.insert(pos, 170);
 
      return 0;
}

C++ STL vector 模拟实现,C++,c++,数据结构

原理图:

情况一:

C++ STL vector 模拟实现,C++,c++,数据结构

 上述代码中的迭代器失效问题也是属于这种情况。

情况二:

C++ STL vector 模拟实现,C++,c++,数据结构

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);
		}
		//扩容后重新计算pos,没有发生扩容pos不变
		pos = _start + len;
		iterator end = _finish;
		//数据挪动
		while (end >= pos)
		{
			(*end) = *(end - 1);
			end--;
		}
		_finish++;
		(*pos) = val;
		return pos;
	}

在使用pos时要注意扩容会使得pos失效,需要重新计算pos位置。

3.erase()

	iterator erase(iterator pos)
	{
        //判断位置是否合法
		assert(pos >= _start);
		assert(pos < _finish);
		iterator end = pos ;
        /挪动数据删除
		while (end < _finish)
		{
			*end = *(end + 1);
			end++;
		}
		_finish--;
		return pos;
	}

九.再看Vector构造函数

std中的vector还支持使用指定个数和初始化值初始化,和迭代器区间初始化。这两个功能在我们平时也是能用到的。

    //1.Vector<T> v(5,10);创建一个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.防止构造函数调用错误
	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);
		}
	}

第三个构造函数的作用是防止构造调用错误冲突,在我们进行如下的调用时:

Vector<int> v2(5, 10);

编译器会以为我们在调用迭代器区间初始化构造函数,因为经过模板的推导,只有迭代器区间初始化构造函数,更适合这个调用。然后将一个整形当作地址在迭代器区间初始化构造函数里面解引用了,报错是:非法的间接寻址

C++ STL vector 模拟实现,C++,c++,数据结构

 正常调用结果:C++ STL vector 模拟实现,C++,c++,数据结构

十.拷贝构造

今天这里编译器默认生成的拷贝构造显然是不能用了。

1.深浅拷贝

万万不可以直接使用拷贝函数按二进制或者按字节直接拷贝了。

错误代码1:

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

原因:

调用处代码:


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

C++ STL vector 模拟实现,C++,c++,数据结构

 会使得我们同一块空间被delete两次从而引发内存错误。

2.正确的拷贝构造代码:

	Vector(const Vector<T>& v)
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		reserve(v.capacity());
		//这里我们将数据一个一个push进去,这样我们借助push_back底层插入的时候,
		//会使用string的赋值构造,完成深拷贝。
		for (int i = 0; i < v.size(); i++)
		{
			push_back(v[i]);
		}
	}
    //现代写法
	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)
	{
		//仅支持容量扩大,不支持容量减小
		if (capacity() < capa)
		{
			size_t sz = size();
			iterator tmp = new T[capa];
			//分清当前的是否已经有了容量,如果已经有了容量需要释放之前的容量,
			//如果之前没有容量仅需,将新开的空间指向我们的_start.
			if (_start)
			{
				//这里千万不能按二进制直接拷贝.
				memcpy(tmp, _start, sizeof(T) * capacity());   /*error !!*/
				delete[] _start;
			}
			//注意:此处不能直接tmp+size()来计算,因为在计算_start的时候已经已经改变了_start,
			//然后计算的size也并非是,准确的size。
			_start = tmp;
			_finish = tmp + sz;
			_end_of_storage = _start + capa;
		}
	}

这里我们仍然是使用了memcpy。

调用处代码:

int main()
{

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

	return 0;
}

C++ STL vector 模拟实现,C++,c++,数据结构

3.正确的 reserve()

void reserve(size_t capa)
	{
		//仅支持容量扩大,不支持容量减小
		if (capacity() < capa)
		{
			size_t sz = size();
			iterator tmp = new T[capa];
			//分清当前的是否已经有了容量,如果已经有了容量需要释放之前的容量,
			//如果之前没有容量仅需,将新开的空间指向我们的_start.
			if (_start)
			{
				//这里千万不能按二进制直接拷贝.
				//memcpy(tmp, _start, sizeof(T) * capacity());   /*ror !!*/
				for (int i = 0; i < size(); i++)
				{
                    //=内置类型直接赋值,自定义类型使用赋值构造
					tmp[i]=_start[i];
				}
				delete[] _start;
			}
			//注意:此处不能直接tmp+size()来计算,因为在计算_start的时候已经已经改变了_start,
			//然后计算的size也并非是,准确的size。
			_start = tmp;
			_finish = tmp + sz;
			_end_of_storage = _start + capa;
		}
	}

这里有一个细节就是在reserve和拷贝构造的拷贝数据的时候我们都是使用了赋值。问题我们并没有重载赋值运算符,编译器自动生成,简单来说就是这里又会是一个浅拷贝。

4.赋值运算符重载

    //传统写法
    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);
	}
    
	Vector<T>& operator=(Vector<T> v)
	{
		swap(v);
		return *this;
	}

现代写法利用,拷贝构造拷贝出来的对象,然后交换对象的成员。

十一.总体代码

#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);创建一个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.防止构造函数调用冲突
	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);
		}
	}

	//传统写法 拷贝构造
	//Vector(const Vector<T>& v)
	//	:_start(nullptr),
	//	_finish(nullptr),
	//	_end_of_storage(nullptr)
	//{
	//	reserve(v.capacity());
	//	//这里我们将数据一个一个push进去,这样我们借助push_back底层插入的时候,
	//	//会使用string的赋值构造,完成深拷贝。
	//	for (int i = 0; i < v.size(); i++)
	//	{
	//		_start[i] = v[i];
	//	}
	//}
	//现代写法,拷贝构造
	Vector(const Vector<T>& v)
		:_start(nullptr),
		_finish(nullptr),
		_end_of_storage(nullptr)
	{
		Vector<T> tmp(v.begin(), v.end());
		swap(tmp);
	}

	//传统写法,赋值拷贝
	//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);
	}

	//现代写法,赋值拷贝
	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)
	{
		//仅支持容量扩大,不支持容量减小
		if (capacity() < capa)
		{
			size_t sz = size();
			iterator tmp = new T[capa];
			//分清当前的是否已经有了容量,如果已经有了容量需要释放之前的容量,
			//如果之前没有容量仅需,将新开的空间指向我们的_start.
			if (_start)
			{
				//这里千万不能按二进制直接拷贝.
				//memcpy(tmp, _start, sizeof(T) * capacity());   /*ror !!*/
				for (int i = 0; i < size(); i++)
				{
					//=内置类型直接赋值,自定义类型使用赋值构造
					tmp[i]=_start[i];
				}
				delete[] _start;
			}
			//注意:此处不能直接tmp+size()来计算,因为在计算_start的时候已经已经改变了_start,
			//然后计算的size也并非是,准确的size。
			_start = tmp;
			_finish = tmp + sz;
			_end_of_storage = _start + capa;
		}
	}

	void resize(size_t n, T val = T())
	{	
		//1.n < size;-->删除数据
		if (n < size())
		{
			_finish = _start + n;
		}
		//2.n > size
		else 
		{
			//(1)如果空间不足,需要扩容+初始化
			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);
		}
		//内置类型直接赋值,自定义类型使用赋值构造
		*(_finish) = val;
		_finish++;
	}

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

	void pop_back()
	{
		//判空
		assert(!empty());
		//我们仅需将维护尾部数据的指针向前挪一位。
		_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);
		}
		//扩容后重新计算pos,没有发生扩容pos不变
		pos = _start + len;
		iterator end = _finish;
		//数据挪动
		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;//数据存储首地址
	iterator _finish;//有效数据尾部地址下一个地址。
	iterator _end_of_storage;//容量尾地址下一个地址
	int tmp;
};




 C++ STL vector 模拟实现,C++,c++,数据结构文章来源地址https://www.toymoban.com/news/detail-645368.html

到了这里,关于C++ STL vector 模拟实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C++ —— STL容器【vector】模拟实现

    C++ —— STL容器【vector】模拟实现

    本章代码gitee仓库:vector模拟实现、vector源码 看源码发现 vector 是类模板定义的,成员是采用迭代器进行管理 当涉及到容器类时,通常有一些关键函数,如构造函数、析构函数和拷贝构造函数,它们负责初始化容器对象、销毁对象和进行对象的拷贝等 这里注意拷贝构造要实现

    2024年02月16日
    浏览(11)
  • 【C++】STL 模拟实现之 vector

    【C++】STL 模拟实现之 vector

    vector 是我们学习的第一个真正的 STL 容器,它接口的使用方式和 string 有一点点的不同,但大部分都是一样的,所以这里我们就只演示其中一些接口的使用,大家如果有疑惑的地方直接在 cplusplus 是上面查看对应的文档即可。 vector 提供了四种构造方式 – 无参构造、n 个 val 构

    2023年04月27日
    浏览(14)
  • STL 关于vector的细节,vector模拟实现【C++】

    STL 关于vector的细节,vector模拟实现【C++】

    _start指向容器的头,_finish指向容器当中 有效数据 的下一个位置,_endofstorage指向整个容器的尾 先开辟一块与该容器大小相同的空间,然后将该容器当中的数据一个个拷贝过来即可,最后更新_finish和_endofstorage的值即可。 深拷贝版本一: 注意: 不能使用memcpy函数 , 如果vec

    2024年02月15日
    浏览(15)
  • 【c++】:STL中vector的模拟使用及模拟实现

    【c++】:STL中vector的模拟使用及模拟实现

        文章目录 前言 一.使用库中vector常用接口 二.vector的模拟实现 总结   上一篇我们讲解了STL中的string的使用和模拟实现,这次我们就来讲解STL中的vector,vector相对于string来说模拟实现会难一些,难点在于迭代器失效问题和深浅拷贝问题。 首先介绍一下vector: 1. vector是表示

    2024年01月21日
    浏览(11)
  • C++ STL学习之【vector的模拟实现】

    C++ STL学习之【vector的模拟实现】

    ✨个人主页: 北 海 🎉所属专栏: C++修行之路 🎊每篇一句: 图片来源 The power of imagination makes us infinite. 想象力的力量使我们无限。 vector 是 STL 中的容器之一,其使用方法类似于数据结构中的 顺序表 ,得益于范型编程和 C++ 特性的加持, vector 更强大、更全能;在模拟实现

    2023年04月08日
    浏览(39)
  • 【C++】STL——vector 深度剖析 及 模拟实现

    【C++】STL——vector 深度剖析 及 模拟实现

    这篇文章我们来学习一下STL里面的vector,它属于STL中容器的一员,我们先来学习一下它的使用,然后,我们也会对vector进行一个深度的剖析和模拟实现。 1.1 vector的介绍 vector的文档介绍 vector 是表示大小可以更改的数组的序列容器: 其实大家可以认为 vector就是我们之前数据结

    2024年02月05日
    浏览(11)
  • C++ stl容器vector的底层模拟实现

    C++ stl容器vector的底层模拟实现

    目录 前言:   1.成员变量,容量与大小 2.构造函数 无参构造: 带参的使用值进行构造:  使用迭代器区间进行构造: 3.交换 4.拷贝构造 5.赋值重载 6.迭代器 7.扩容 reserve: resize: 8.插入与删除 insert: erase: insert迭代器失效问题: erase迭代器失效问题: 9.头插头删 10.[]重载

    2024年04月15日
    浏览(14)
  • 【C++】STL之vector功能及模拟实现

    【C++】STL之vector功能及模拟实现

    目录 前沿 一、vector的使用  1、vector 构造函数的声明  2、vector 迭代器的使用  3、vector 空间增长问题  4、vector 的增删查改 二、vector的模拟实现  1、vector 的成员变量  2、迭代器  3、容量相关(resize, reserve)  4、数据访问相关  5、插入删除   5.1 任意位置插入   5.2 任意位置

    2024年02月16日
    浏览(6)
  • 【C++初阶】STL详解(四)vector的模拟实现

    【C++初阶】STL详解(四)vector的模拟实现

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 注:为了防止与标准库当中的vector产生命名冲突

    2024年02月05日
    浏览(14)
  • 【C++】透过STL源码深度剖析及模拟实现vector

    【C++】透过STL源码深度剖析及模拟实现vector

    鉴于读者的响应,打算将文章拆分一下,方便观看,基本接口可看 深入浅出STL之vector类 以下我所介绍的都是基于【SGI】版本的STL,对源码有兴趣的同学可以去看看 侯捷老师的《STL源码剖析》 然后呢我们就去调出【vector】的一些核心源码,这里我们主要关注的就是这个使用原

    2024年02月14日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包