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容器的介绍与模拟实现

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

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

    2023年05月17日
    浏览(51)
  • C++ STL vector 模拟实现

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

    2024年02月13日
    浏览(35)
  • C++ [STL之vector模拟实现]

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

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

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

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

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

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

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

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

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

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

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

    2024年02月05日
    浏览(47)
  • 【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日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包