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

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

C++ —— STL容器【vector】模拟实现,原创,C++,c++,开发语言,C语言

本章代码gitee仓库:vector模拟实现、vector源码

😈0. 搭个框架

#include<iostream>
#include<vector>
#include<string>
#include<assert.h>
using std::cout;
using std::endl;
namespace myvector
{
	template<typename T>
	class vector
    {
        public:
        	typedef T* iterator;
        	typedef const T* const_iterator;
        private:
    }
    
    //代码测试区
    void t1(){}
    //...
}

😄1. 成员

看源码发现vector是类模板定义的,成员是采用迭代器进行管理

C++ —— STL容器【vector】模拟实现,原创,C++,c++,开发语言,C语言

iterator _start;	//初始位置
iterator _finish;	//结束位置
iterator _end_of_storage;	//容量

👻2. 构造函数 & 析构函数 & 拷贝构造

当涉及到容器类时,通常有一些关键函数,如构造函数、析构函数和拷贝构造函数,它们负责初始化容器对象、销毁对象和进行对象的拷贝等

这里注意拷贝构造要实现的是深拷贝

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

vector(size_t n, const T& val=T())
	:_start(nullptr)
	, _finish(nullptr)
	, _end_of_storage(nullptr)
{
	resize(n, val);
}
//有选择
vector(int n, const T& val = T())
	:_start(nullptr)
	, _finish(nullptr)
	, _end_of_storage(nullptr)
{
	resize(n, val);
}

//拷贝构造
vector(const vector<T>& v)
	:_start(nullptr)
	, _finish(nullptr)
	, _end_of_storage(nullptr)
{
	size_t vSize = v.size();
	if (vSize > 0)
	{
		_start = new T[vSize];
        //深拷贝
		for (size_t i = 0; i < vSize; i++)
		{
			_start[i] = v._start[i];
		}
		_finish = _start + vSize;
		_end_of_storage = _start + vSize;
	}
}
//迭代器初始化
template<typename InpuIterator>
vector(InpuIterator first, InpuIterator last)
	:_start(nullptr)
	, _finish(nullptr)
	, _end_of_storage(nullptr)
{
	while (first != last)
	{
		push_back(*first);
		++first;
	}
}
//析构
~vector()
{
	if (_start)
	{
		delete[] _start;
		_start = _finish = _end_of_storage = nullptr;
	}
}

😺3. 迭代器

加上const,兼容具有常属性的元素

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

🙉4. operator[] & 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];
}

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

🤖5. 容器的容量 & 个数

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

👾6. 扩容

void reserve(size_t n)
{
	if (capacity() < n)
	{
		const size_t old_size = size();
		iterator tmp = new T[n];
		//	_start不为空挪数据
		if (_start)
		{
            //实现深拷贝
            //memcpy(tmp, _start, sizeof(T) * old_size);
			for (size_t i = 0; i < old_size; ++i)
			{
				tmp[i] = _start[i];
			}
			delete[] _start;
		}
		_start = tmp;
		_finish = tmp + old_size;
		_end_of_storage = _start + n;
	}
}

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

👿7. 插入 & 删除操作

指定位置插入/删除时,要注意迭代器失效的问题,采用iterator为返回类型,可以接收修改后的位置

迭代器失效:
在对容器进行插入和删除操作时,特别是涉及重新分配内存的情况下,会导致迭代器失效。
插入元素可能导致插入位置之后的元素迭代器失效,而删除元素可能导致删除位置之后的元素迭代器失效。
一旦迭代器失效,对其进行解引用或使用会导致未定义的行为

void push_back(const T& x)
{
	insert(end(), x);
	/*if (_finish == _end_of_storage)
	{
		reserve(capacity() == 0 ? 4 : 2 * capacity());
	}
	*_finish = x;
	_finish++;*/
}
void pop_back()
{
	--_finish;
}
iterator insert(iterator pos, const T& x)
{
	assert(pos >= _start && pos <= _finish);
	if (_finish == _end_of_storage)
	{
		size_t n = pos - begin();
		reserve(capacity() == 0 ? 4 : 2 * capacity());
		pos = begin() + n;
	}
	iterator end = _finish - 1;
	while (pos <= end)
	{
		*(end + 1) = *end;
		--end;
	}
	*pos = x;
	++_finish;
	return pos;
}
iterator erase(iterator pos)
{
	assert(pos >= _start && pos < _finish);
	if (pos+1 != _finish)
	{
		iterator it = pos + 1;
		while (it != _finish)
		{
			*(it-1) = *it;
			++it;
		}
	}
	--_finish;
	return pos;
}

这里还是要注意深浅拷贝,自定义类型一定是要进行深拷贝的。

那么本期的分享就到这里,我们下期再见,如果还有下期的话。文章来源地址https://www.toymoban.com/news/detail-605007.html

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

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

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

相关文章

  • STL之vector容器的介绍与模拟实现

    STL之vector容器的介绍与模拟实现

    所属专栏:C“嘎嘎\\\" 系统学习❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ vector的文档介绍 vector是表示可变大小数组的序列容器。 就像

    2024年01月21日
    浏览(11)
  • C++ STL vector 模拟实现

    C++ STL vector 模拟实现

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

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

    【C++ STL】vector模拟实现

    2023年05月17日
    浏览(35)
  • C++ [STL之vector模拟实现]

    C++ [STL之vector模拟实现]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT vector是STL容器容器之一,其底层实现类似于数据结构顺序表,相当于string来说得益于泛型模板的加持使得vector可以变为任何类型,且是可以动态扩容,堪称大号数组!在vector的实现中,有许多值得我们学习的细节,接下来将为大家

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

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

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

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

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

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

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

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

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

    2024年01月21日
    浏览(13)
  • 【C++】STL——vector 深度剖析 及 模拟实现

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

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

    2024年02月05日
    浏览(12)
  • 【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日
    浏览(9)
  • C++ STL学习之【vector的模拟实现】

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

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

    2023年04月08日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包