[C++]:11.模拟实现vector

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

二.模拟实现vector

0.看一看源码SGI

1.vector.h

[C++]:11.模拟实现vector,c++,java,开发语言

vector.h中其实包含了许多的头文件,我们在cpp中包含文件的时候头文件中还会去展开这四个头文件关于vector类主要在这个stl_vector.h中。

2.stl_vector.h

1.构造:

[C++]:11.模拟实现vector,c++,java,开发语言

ps:在当前的学习阶段看源码不要一行一行去看因为水平不足所以非常多基本上是看不懂的所以不要去一行一行去看要全方面的去看有一些看不懂问题不大。

[C++]:11.模拟实现vector,c++,java,开发语言

[C++]:11.模拟实现vector,c++,java,开发语言

2.析构函数:

[C++]:11.模拟实现vector,c++,java,开发语言

3.push_back()

[C++]:11.模拟实现vector,c++,java,开发语言

1.构造函数:

1-1:参数为空的!

1.构造函数的初始化列表给全空:
2.构造函数的内容给赋值全空:
3.C++11 支持的声明变量的时候初始化(走的初始化列表):
4.综上所述第三个方法最方便:我们都可以在定义的时候去初始化非常的方便。


vector(size_t n , const T& val=T())
	:start(nullptr)
	,finish(nullptr)
	,end_of_storage(nullptr)
{
}

vector()
{
		start = nullptr;
		finish = nullptr;
		end_of_storage = nullptr;
}


private:
	iterator start = nullptr;
	iterator finish = nullptr;
	iterator end_of_storage = nullptr;


1-2:n个数据的!

情况一:n个数据传第二个参数初始化数据的:
情况二:n个数据不传第二个参数就开空间不初始化的:
1.对于我情况二的操作其实本质是初始化容量空间为全 val (内置类型的默认构造值),但是我的finish == start所以在后面使用的时候数据进入是赋值进入:

vector(size_t n , const T& val=T())
			{
				resize(n,val);
			}
vector(int n , const T& val=T())
			{
				resize(n,val);
			}

1-3:范围构造:

//1-3:范围初始化:
//1-4:使用新的模板方便使用不同类型的迭代器进行范围构造
			template<class InputIterator>
			vector(InputIterator left, InputIterator right)
			{
				while (left != right)
				{
					push_back(*left);
					left++;
				}
			}

2.析构函数:

//析构:
~vector()
{
	delete[] start;
	start = nullptr;
	finish = nullptr;
	end_of_storage = nullptr;
}

3.迭代器+遍历数据:

3-1:迭代器:

[C++]:11.模拟实现vector,c++,java,开发语言

[C++]:11.模拟实现vector,c++,java,开发语言

//3.迭代器:
		
			iterator begin()const
			{
				return start;
			}
			iterator end()const
			{
				return finish;
			}

			iterator_const cbegin()const
			{
				return start;
			}
			iterator_const cend()const
			{
				return finish;
			}

			iterator rbegin()const
			{
				return finis - 1;
			}
			iterator rend()const
			{
				return start-1;
			}

			iterator_const crbegin()const
			{
				return finis - 1;
			}
			iterator_const crend()const
			{
				return start - 1;
			}

3-2:数据遍历:

void print_value()const
			{
				assert(start != end_of_storage);
				int num = finish - start;

				for (int i = 0; i < num; i++)
				{
					cout << *(start + i) << " ";
				}
				cout << endl;
			}

			T& operator[](size_t pos)
			{
				return *(start + pos);
			}
void text_2()
{
	sfpy::vector<int> v1(10, 2);
	sfpy::vector<int> v2(v1);
	sfpy::vector<int> v3(10);

	sfpy::vector<int>::iterator it_1 = v1.begin();
	while (it_1 != v1.end())
	{
		cout << *it_1 << " ";
		it_1++;
	}
	cout << endl;

	v1.print_value();

	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;


	sfpy::vector<int>::iterator it_2 = v2.begin();
	while (it_2 != v2.end())
	{
		cout << *it_2 << " ";
		it_2++;
	}

	cout << endl;

	v2.print_value();

	for (int i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << " ";
	}
	cout << endl;
}

4.空间问题:

[C++]:11.模拟实现vector,c++,java,开发语言

4-1:size() 和capacity

//4.size() 和 capacity()

	size_t size()const
	{
		return finish - start;
	}
	size_t capacity()const
	{
		return end_of_storage - start;
	}

4-2:resize 和 reserve:

void reserve(size_t n)
			{
				//assert(n > capacity());
				//1.重新配置空间:
				T* tmp = new T[n];

				if (n > capacity())
				{
					size_t n_1 = size();
					for (size_t i = 0; i < n; i++)
					{
						if (i < n_1)
						{
							tmp[i] = *(start + i);
						}
						else
						{
							tmp[i] = T();
						}
					}
					delete[] start;
					start = tmp;
					finish = tmp + n_1;
					end_of_storage = tmp + n;
				}
			}

			void resize(size_t n, T val = T())
			{
				if (n > size())
				{
					reserve(n);
					while (finish < start + n)
					{
						*finish = val;
						++finish;
					}
				}
				else
				{
					finish = start + n;
				}
			}

1.关于reserve的补充:
2.为什么不去使用memcpy这样的的函数本质这是一个浅拷贝。
3.调用delete[] 释放空间+调用析构函数。
4.内置类型使用memcpy没有问题。
5.对于自定义类型来说使用memcpy会产生浅拷贝的问题

[C++]:11.模拟实现vector,c++,java,开发语言

[C++]:11.模拟实现vector,c++,java,开发语言

4-3:empty

bool empty()
{
		if (size() == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
}

4-4:shrink_to_fit

void shrink_to_fit()
{
	assert(size() >= capacity);

	//1.重新配置空间:
	size_t n = size();
	T* tmp = new T[n];

	//减少:
	memcpy(tmp, start, size(T) * n);

	start = tmp;
	finish = end_of_storage = tmp + n;
}

5.增删查改:

5-1:push_back()

void push_back(const T& val)
{
	if (finish == end_of_storage)
	{
		size_t new_capacity =(start == finish ? 4 : (capacity() * 2));			
		reserve(new_capacity);
	}

	(*finish) = val;
	finish++;
}

[C++]:11.模拟实现vector,c++,java,开发语言

5-2:pop_back()

void pop_back()
{
	assert(size() != 0);
	//resize(size() - 1);
	(*finish) = T();
	finish--;
}

[C++]:11.模拟实现vector,c++,java,开发语言

5-3:find()

[C++]:11.模拟实现vector,c++,java,开发语言

1.find()是一个全局函数不是一个特定的类就有一个find() .
2.find()是通过类模板实现的。
3.find()的返回值是一个iterator。

template <class T>
	T* find(T* first, T* last, const T& val)
	{
		while (first != last)
		{
			if (*first == val) 
				return first;

			++first;
		}
		return last;
	}

[C++]:11.模拟实现vector,c++,java,开发语言

5-4:insert() :在find之前插入

[C++]:11.模拟实现vector,c++,java,开发语言

iterator insert(iterator position, const T& val)
{
				size_t pos = position - start;
				size_t n = size();

				if (finish == end_of_storage)
				{
					size_t new_capacity = (start == finish ? 4 : (capacity() * 2));
					reserve(new_capacity);
				}

				//void * memmove ( void * destination, const void * source, size_t num );

				memcpy(start + pos + 1, start + pos, (n - (pos))*sizeof(T));
				*(start + pos) = val;
				finish++;

				return start + pos;
}

[C++]:11.模拟实现vector,c++,java,开发语言

5-5:erase() : 删除find位置

[C++]:11.模拟实现vector,c++,java,开发语言

iterator erase(iterator position)
			{
				assert(size() != 0);

				size_t pos = position - start;
				size_t n = size();

				//void * memmove ( void * destination, const void * source, size_t num );
				memcpy(start + pos , start + pos +1, (n - (pos+1)) * sizeof(T));
				finish--;

				return start + pos;
			}

[C++]:11.模拟实现vector,c++,java,开发语言

5-6:insert和erase

1.在vs下insert和erase传进去的迭代器在使用之后就不可以继续使用了(有可能发生迭代器失效的情况)。
2.在vs下是会认为迭代器失效。
3.模拟实现insert和erase —> insert返回插入新的元素的迭代器,erase返回删除元素的下一个元素的迭代器。
4.pos就不要继续使用应该去使用insert和erase的返回值。文章来源地址https://www.toymoban.com/news/detail-794333.html

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

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

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

相关文章

  • C++模拟实现vector

    目录 1.代码实现 2.注意事项 1.成员变量 2. 不能使用memcpy函数拷贝数据 1.用string类型测试时,要考虑到vs可能把数据存储在数组buffer里面 3.insert函数中指针的失效性 1.加引用,那么就不能传常量,比如v.begin() + 3 2.加引用,就只能传变量了  4.erase成员函数的指针的失效性 这边以

    2024年02月17日
    浏览(43)
  • 【vector的模拟实现】

    目录 1 类的成员变量 2 常用成员函数和迭代器 3 增删查改 3.1 reverse 3.2 push_back 3.3 resize 3.4 insert erase 4 默认成员函数 4.1 构造函数 4.2 拷贝构造 4.3 赋值运算符重载 4.4 析构函数 前面我们详细介绍了string类的使用,vector的使用与string相差不大,大家可以自己到官网上查询:vector的

    2024年01月16日
    浏览(41)
  • STL 关于vector的细节,vector模拟实现【C++】

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

    2024年02月15日
    浏览(43)
  • 详解c++---vector模拟实现

    首先我们知道vector是一个顺序表,并且可以存放各种各样类型的数据,所以我们这里的类得是一个模板类,因为vector中的数据存放是一段连续的空间我们可以通过对指针的加减从而来获得一系列的数据,所以vector的迭代器就可以通过对指针重命名来实现,其次迭代器有两个类

    2024年02月02日
    浏览(26)
  • 【STL】模拟实现vector(详解)

    2023年05月14日
    浏览(37)
  • 【STL】vector的模拟实现

    目录 前言 结构解析 构造析构 构造 默认构造 初始化成 n 个 val  以迭代器区间构造 拷贝构造 析构 运算符重载 赋值重载 下标访问 迭代器 const迭代器 容量操作 查看大小和容量 容量修改 数据修改 尾插尾删 指定位置插入和删除 insert erase 清空 判空 交换 源码 从vector开始就要开

    2024年02月06日
    浏览(66)
  • 【STL】 模拟实现简易 vector

    目录 1. 读源码 2. 框架搭建 3. vector 的迭代器 4. vector 的拷贝构造与赋值 拷贝构造 赋值 5. vector 的常见重要接口实现 operator[ ] 的实现 insert 接口的实现 erase 接口实现 pop_back 接口的实现 resize 接口实现 源码分享 写在最后: 想要自己实现一个 vector,读源码来理解他的实现是必不

    2024年02月16日
    浏览(35)
  • 【STL】:vector的模拟实现

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关vector的模拟实现,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 C + + 专 栏   : C++ Linux 专

    2024年02月06日
    浏览(97)
  • [STL] vector 模拟实现详解

    目录 一,准备工作 二,push_back   1, 关于引用 2. 参数const 的修饰  补充 三,迭代器实现 四,Pop_back 五,insert 1. 补充——迭代器失效 六, erase 七,构造函数  1. 迭代器构造  2. 其他构造 3. 拷贝构造  1) 传统写法 2)现代写法(提高函数复用性)  八,赋值符号重载 九,

    2024年02月16日
    浏览(39)
  • C++中的vector类模拟实现

    目录 vector模拟实现 vector类设计 vector类构造函数 vector类根据个数构造函数 vector类根据迭代器区间构造函数 vector类拷贝构造函数 vector类赋值运算符重载函数 vector类析构函数 vector类获取有效数据个数函数 vector类获取容量大小函数 vector类begin()函数 vector类end()函数 vector类reser

    2024年04月13日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包