Bootstrap

vector

1.1vector的定义

构造函数声明

vector(重点)                                                                                        无参构造

vector(size_type n,const value_type& val=value_type())                     构造并初始化n个val

vector(const vector& x);                                                                          拷贝构造

vector(Inputlerator first,Inputlterator last);                                               使用迭代器进行初始化构造

1)

2)

vector支持这种初始化

#pragma once
#include<assert.h>
namespace DD
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;


		//支持迭代器相关的接口
		iterator begin()
		{
			return _start;
		}
		iterator end()
		{
			return _finish;
		}

		const_iterator iterator begin()const
		{
			return _start;
		}
		const_iterator iterator end()const
		{
			return _finish;
		}
		vector()
			:_start(nullptr)
			,_finish(nullptr)
			,_endofstorage(nullptr)
		{}
		~vector()//析构
		{
			if (_start)
			{
				delete[]_start;
				_start = _finish = _endofstorage = nullptr;
			}
		}
		T&operator[](size_t i)//返回这个数据的引用,就可以像数组一样使用了
		{
			assert(i < size());
			return _start[i];
		}
		size_t size() const
		{
			return _finish - _start;
		}
		size_t capacity()const
		{
			return _endofstorage - _start;
		}
		void reserve(size_t n)
		{
			if (n > capacity())
			{
				size_t oldSize = size();//更新size之前记录oldSize
				T* tmp = new T[n];//T的类型不确定,所以用new
				if (_start)
				{
					memcpy(tmp, _start, sizeof(T) * sizeof());//拷贝
					delect[]_start;//释放旧空间
				}
				_start = tmp;//指向新空间
				_finish = _start + oldSize;//有size个数据
				_endofstorage = _start + n;//空间到n
			}
		}
		void push_back(const T& x)
		{
			//if (_finish == _endofstorage)
			//{
			//	//扩容
			//	reserve(capacity() == 0 ? 4 : capacity() * 2);
			//    //不是0就扩二倍
			//}
			//*finish = x;
			//++_finish;
			insert(_finish, x);//插入
		}

		//提供一个接口
		bool empty()
		{
			return _start == _finish;
		}

		//尾删
		void pop_back()
		{
			assert(!empty());
			--_finsh;
		}

		//插入
		void insert(interator pos, const T& x)
		{
			assert(pos >= _start && pos <= _finish);
			if (_finish == _endofstorage)
			{
				size_t len = pos - _start;//更新,扩容要指向新空间
				reserve(capacity() == 0 ? 4 : capacity() * 2);
				pop = _start + len;
			}

			iterator i = _finish - 1;
			while (i >= pos)
			{
				*(i + 1) = *i;
				--i;
			}
			*pos = x;
			++_finish;
		}

		void erase(iterator pos);//删除

	private:
		//指向开始,最后一个位置的下一个位置,空间结束的位置
		iterator _start;
		iterator _finish;
		iterator _endofstorage;
	};

	void text_vector1()
	{
		vector<int> v1;
		v1.push_back(1);
		v1.push_back(2);
		v1.push_back(3);
		v1.push_back(4);

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

		v1.insert(v1.begin() + 2, 30);

		for (auto e : v1)//范围for的底层是迭代器
		{
			cout << e << " ";
		}
		cout << endl;

		v1.pop_back();

		//迭代器
		vector<int>::iterator it1 = v1.begin();
		while (it1 != v1.end())
		{
			cout << *it1 << " ";
			++it1;
		}
		cout << endl;
	}
}

1.2 vector  iterator  的使用

begin+end                                                  获取第一个数据位置的iterator/const_iterator,获取最后                                                                       一个数据的下一个位置的iterator/const_iterator

rbegin+rend                                               获取最后一个数据位置的reverse_iterator,获取第一个数                                                                    据前一个位置的reverse_iterator

vector 空间增长问题

size                             获取数据个数

capacity                      获取容量大小

empaty                       判空

resize                         改变vector的size

reserve                       改变vector的capacity

vs下capacity是按1.5倍增长的,g++是按2倍增长的

vector增删查改

push_back                                尾插

pop_back                                  尾删

find                                           查找

insert                                         在position之前插入val

erase                                         删除position位置的数据

swap                                         交换两个vector的数据空间

operator []                                  像数组一样访问

//越界是直接断言的

vector迭代器失效问题

迭代器的主要作用就是让算能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装

vector 的迭代器就是原生态指针T*,因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,程序会崩溃(继续使用已经失效的迭代器,程序可能会崩溃)

1)

第一种失效:扩容引起的野指针问题

2)

第二种失效:删除数据,导致数据,返回删除数据的下一个位置,导致数据挪动,it已经不是指向之前的位置了,it也就失效了,不是指向之前的位置,可能会导致逻辑问题

vs下报错,强制类型检查,失效迭代器不能让你访问

接下来我们来看一个场景

删除所有的偶数

resize

拷贝

一个类模板的成员函数,也可以是一个函数模板

使用memcpy拷贝问题

memcpy的拷贝实际是浅拷贝

改成for循环赋值拷贝

赋值重载:两个已经存在的对象进行拷贝或者调用的是赋值重载

调用string的赋值重载

隐藏的深拷贝

;