【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)

这篇具有很好参考价值的文章主要介绍了【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌏博客主页: 主页
🔖系列专栏: C++
❤️感谢大家点赞👍收藏⭐评论✍️
😍期待与大家一起进步!



前言

我们模拟vector是用迭代器(start,end,endofstorage)来控制增删查改操作的

【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝),c++,开发语言

一、 整体

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

1普通构造

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

2迭代器构造

template<class InputIterator>
		//【first,last)左闭右开区间
		vector(InputIterator first, InputIterator last) {
			while (first != last) {
				push_back(*first);
				first++;
			}
		}

3初始化字符构造

vector(size_t n, const T& val = T()) {
//const T& val = T()调用T的默认构造的缺省参数
			resize(n, val);
		}

4拷贝构造:

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];//实行深拷贝
			}
			_finish = _start + sz;
			_endofstorage = _start + v.capacity();
		}

3析构函数

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

二、成员函数实现

1.大小

1当前大小(size())

//我本身是一个const对象,不可变,所以就需要调用一个const函数,
//但我要是一个非const对象,那么调用非const或者const函数是都都可以的
//这 成员函数加个const,这样const和非const对象都就可以调用了
		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.内存预留(reserve)

	void reserve(size_t n) {
			if (n > capacity()) {
				T* tmp = new T[n];
				size_t sz = size();
		//提前存下size,因为后面start会变动
				
				if (_start) {
					for (size_t i = 0; i < sz; i++) {
						tmp[i] = _start[i];
					}
//这里拷贝原来的数据不用memcpy是因为memcpy是浅拷贝我们vector要的是深拷贝
//所以用for循环调用赋值运算符重载,实现对象的深拷贝
					delete[] _start;
				}
				_start = tmp;
				_finish = _start + sz;
				_endofstorage = _start + n;
			}
		}

5.调整vector的有效长度(resize)

void resize(size_t n, const T& val = T()) {
			//将前n个数据初始化为val
			//从当前已有数据后面开始
			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) {
				//判断是否需要扩容
				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的相对位置
				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后面的数据朝前覆盖
			while (it != _finish) {
				*(it - 1) = *it;
				++it;
			}
			_finish--;
			return pos;
		}

9.赋值运算符重载

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);
			//创建一个临时对象,临时对象为v的拷贝
			//交换this与v的数据,出了作用域以后
			//this获得新的数据,临时对象v出作用域销毁
			return *this;
		}

深浅拷贝问题(reserve):

【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝),c++,开发语言

【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝),c++,开发语言
【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝),c++,开发语言
【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝),c++,开发语言文章来源地址https://www.toymoban.com/news/detail-606490.html

到了这里,关于【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C++:list增删查改模拟实现

    本篇博客采用SGI版本,同时考虑到看到此篇博客大部分为初学者,为此博主仅仅给出有用片段。 C++:list增删查改模拟实现就是用C++复写双链表,非常简单。难点主要在迭代器实现 list底层使用什么数据结构来实现的呢?我们先来看看SGI库中list的成员函数和初始化吧。 我们发现

    2024年02月04日
    浏览(41)
  • 【c++】vector的增删查改

    为了防止和库里面发生冲突,定义一个命名空间,将类对象放在命名空间 里面 1.返回指向顺序表开始的迭代器函数 2.返回指向顺序表结尾的迭代器函数 3.返回容量大小的函数 4.返回顺序表元素多少 5.判断顺序表为空地的函数 5.一个运算符重载的函数(返回给定下标下的值)

    2024年02月20日
    浏览(38)
  • C++:stack、queue、priority_queue增删查改模拟实现、deque底层原理

    我们先来看看 stack的相关接口有哪些: 从栈的接口,我们可以知道栈的接口是一种特殊的vector,所以我们完全可以使用vector来模拟实现stack。 因此我们可以将底层容器定义成模板,然后将容器类变量作为成员变量进行封装。在实现satck的各种接口时,通过成员变量来调用底层

    2024年02月03日
    浏览(41)
  • C++初阶-vector类的模拟实现

    C++ STL中的vector就类似于C语言当中的数组,但是vector又拥有很多数组没有的接口,使用起来更加方便。 相比于STL中的string,vector可以定义不同的数据类型。 迭代器的本质可以暂时看作是指针,模拟实现vector,需要定义三个指针:指向起始位置_start,指向最后一个有效元素的下

    2024年02月04日
    浏览(149)
  • 【C++】:拷贝构造函数与赋值运算符重载的实例应用之日期类的实现

    🔑日期类的实现,将按以下声明依次进行,其中因为Print函数比较短,直接放到类里面让其变成内联函数 🔑而我们实现日期类经常要用到某月有多少天,在这里先把获得某月有多少天的函数实现出来。实现时先检查传参有没有问题,在注意把数组设置成静态的,出了作用域

    2024年02月08日
    浏览(61)
  • 【C++练级之路】【Lv.7】【STL】vector类的模拟实现

    快乐的流畅:个人主页 个人专栏:《C语言》《数据结构世界》《进击的C++》 远方有一堆篝火,在为久候之人燃烧! 关于STL容器的学习,我们来到了运用 最广泛、最常见的vector 。有了之前关于string的学习,我们对容器设计有了一个大概的了解,而今天在熟悉的基础上去探求

    2024年01月24日
    浏览(47)
  • 【C++技能树】类的六个成员函数Ⅰ --构造、析构、拷贝构造函数

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 在开始本章内容之前,先浅浅的了解一下this指针的概念.这对理解后面的内容有着很大的帮助. this指针 顾名思义就是这个指针,我们先来看看下面这段很简单的代码 首先创建了一个

    2024年02月02日
    浏览(46)
  • C++中类的6个默认成员函数 【拷贝构造函数】

    在前几章学习对象的时候,我们有的时候需要一个与已存在对象一某一样的新对象 那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢? 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时

    2024年02月20日
    浏览(49)
  • [C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调

    C语言中,字符串是以’\\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合面向对象的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。 因此C++中,为了让我们更简单、方便

    2024年02月12日
    浏览(36)
  • C++_String增删查改模拟实现

    本篇博客仅仅实现存储字符的string。同时由于C++string库设计的不合理,博主仅实现一些最常见的增删查改接口! 接下来给出的接口都是基于以下框架: 博主在这仅仅提供如 无参和带参默认构造 接口: 小tips: C++string标准库中,无参构造并不是空间为0,直接置为空指针。而

    2024年02月04日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包