【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

对vector容器的个人理解,具体使用方式可查阅手册:cplusplus.com

vector

1.构造

构造一个元素类型为int,元素为空的vector容器
vector<int> v1;

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

构造一个元素类型为int,4个元素且都为100的vector容器
vector<int> v2(4, 100);

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

区间构造,从arr起始位置到4的位置,4不会被构造进去
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

拷贝构造,v4拷贝构造v3
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

2.迭代器操作

2.1begin

返回起始位置的指针。如:通过对该指针++,解引用就可以访问元素了

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	auto it = v4.begin();

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

2.2end

返回的是vector中最后一个节点末尾位置,一般用来做判断条件的
【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	auto it = v4.begin();
	while (it != v4.end())//判断条件
	{
		cout << *it << endl;
		it++;//迭代器++
	}

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

2.3rbegin

反向迭代器,指向最后一个元素的位置

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	auto it = v4.rbegin();

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

2.4rend

反向迭代器,指向起始位置。
【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	auto it = v4.rbegin();
	while (it != v4.rend())
	{
		cout << *it << endl;
		it++;

	}

结果::在这里仍然需要++,而不是--

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

3.容量操作

3.1size

返回有效元素的个数。

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	cout << v4.size() << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

3.2resize

更改有效元素个数。

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	v4.resize(1);
	cout << v4.size() << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

3.3capacity

返回底层容量的大小。

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	cout << v3.capacity() << endl;
	cout << v4.capacity() << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

3.4empty

判断vector容量是否为空,即size个数为0个

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	if (!v4.empty())
		cout << "非空" << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

3.5reserve

改变底层容量大小,即更改capacity的大小。注意:比oldcapacity大,会扩容,比oldcapacity小,不会做变化。

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	v4.reserve(100);//更改为100
	cout << v4.capacity() << endl;
	v4.reserve(3);//更改为3
	cout << v4.capacity() << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

3.6shrink_to_fit

让vector容器的capacity调整到合适的大小,即有效元素为多少个,就为多大。

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	v4.reserve(100);//更改为100
	cout << v4.capacity() << endl;
	v4.shrink_to_fit();//会自动改为3
	cout << v4.capacity() << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

4.元素访问

4.1operator[]

运算符重载,使vector容器中的元素,可以像数组一样访问。

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	cout << v4[0] << endl;
	cout << v4[1] << endl;
	cout << v4[2] << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

4.2at

和[]同样,对元素进行访问。

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	cout << v4.at(0) << endl;
	cout << v4.at(1) << endl;
	cout << v4.at(2) << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

4.3front

返回第一个元素。

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	cout << v4.front() << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

4.4back

返回最后一个有效元素

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	cout << v4.back() << endl;

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

4.5data

返回起始位置的指针

	int arr[] = { 1,2,3,4,5 };
	vector<int> v3(arr, arr + 3);
	vector<int> v4(v3);
	int *p = v4.data();

结果:操作该指针就可获取,更改vector容器中的值。

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

5.修改操作

5.1assign

更改vector容器中有效元素个数,并且设置为同样的值。

	vector<int> vv{1,2,3,4,5,6};
	vv.assign(7, 100);//7个100

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

5.2push_back

尾部插入数据。

	vector<int> vv{1,2,3,4,5,6};
	vv.push_back(7);

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

5.3pop_back

尾部删除数据。

	vector<int> vv{1,2,3,4,5,6};
	vv.push_back(7);
	vv.pop_back();//7没了

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

5.4insert

3种插入方式:

  1. 指定位置,插入指定的元素
	vector<int> vv{1,2,3,4,5,6};
	vv.insert(vv.begin(), 2);//指定的位置为迭代器类型

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!
2. 指定位置,指定插入多少个元素,指定的元素

	vector<int> vv{1,2,3,4,5,6};
	vv.insert(vv.begin(),5, 2);//插入5个元素,都为2

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!
3. 指定位置,区间插入

	int arr[] = { 6,5,4,3,2,1 };
	vector<int> vv{1,2,3,4,5,6};
	vv.insert(vv.begin(), arr, arr + 6);

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

5.5erase

两种删除方式:

  1. 删除指定位置,传入的是迭代器
	vector<int> vv{1,2,3,4,5,6};
	auto it = vv.begin() + 1;//删除2这个节点
	vv.erase(it);

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!
2. 区间删除,都传入迭代器

	vector<int> vv{1,2,3,4,5,6};
	vv.erase(vv.begin(),vv.begin() + 3 );//删除1 ~ 3

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

5.6swap

用于交换两个迭代器。

	vector<int> vv{1,2,3,4,5,6};
	vector<int> sw{ 6,5,4,3,2,1 };
	vv.swap(sw);

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

5.6clear

清空vector容器,此时有效元素为0,容量还在。

	vector<int> vv{1,2,3,4,5,6};
	vv.clear();

结果:

【C++】vector入门,各个vector接口的详细介绍和使用,简单模拟实现vector!!!!

6.模拟实现vector

namespace MyVector
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		vector()//空构造
			:_start(nullptr)
			,_finish(nullptr)
			,_end_of_storage(nullptr)
		{}
		
		vector(int n,const T& data = T())//可构造多个同样数据
			:_start(new T[n])
			,_finish(_start + n)
			,_end_of_storage(_finish)
		{
			for (int i = 0; i < n; i++)
				_start[i] = data;
		}
		
		template<class Iterator>
		vector(Iterator first, Iterator end)//区间构造
		{
			auto it = first;
			int count = 0;
			while (it != end)
			{
				++count, ++it;
			}
			_start = new T[count];
			_finish = _start;
			_end_of_storage = _finish;
			it = first;
			int i = 0;
			while (it != end)
			{
				_start[i] = *it;
				++it, ++i;
			}
		}
		
		vector(vector<T>& vv)//拷贝构造
		{
			_start = new T[vv.capacity()];
			_finish = _start + vv.size();
			_end_of_storage = _start + vv.capacity();
			for (size_t i = 0; i < vv.size(); ++i)
			{
				*(_start+i) = vv[i];
			}
		}

		~vector()//析构
		{
			if (_start)
				delete[] _start;
			_start = _finish = _end_of_storage = NULL;
		}

		//iterator 操作
		iterator begin(const vector<T>& vv)
		{
			return _start;
		}

		iterator end(const vector<T>& vv)
		{
			return _finish;
		}

		//capacity操作
		size_t size()const
		{
			return _finish - _start;
		}

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

		void resize(size_t n, const T& data = T())
		{
			size_t oldsize = size();
			if (n > oldsize)
			{
				if (n > capacity)
					reserve(n);
				for (size_t i = oldsize; i < n; ++i)
					_start[i] = data;
			}
			_finish = _start + n;
		}

		void reserve(size_t n)
		{
			size_t oldcapacity = capacity();
			if (n > oldcapacity)
			{
				T* tmp = new T[n];
				size_t count = size();
				if (_start)
				{
					memcpy(tmp, _start, sizeof(T) * oldcapacity);
					delete[] _start;
				}
				_start = tmp;
				_finish = _start + count;
				_end_of_storage = _start + n;
			}
		}

		bool empty()const
		{
			return _start == _finish;
		}

		//element access
		T& operator[](size_t n)
		{
			return *(_start + n);
		}

		T at(size_t n)
		{
			assert(n < size());
			return *(_start + n);
		}

		T front()
		{
			return *_start;
		}

		T back()
		{
			return *(_finish - 1);
		}

		//modifiy
		void push_back(const T& data)
		{
			if (_finish == _end_of_storage)//
			{
				reserve(capacity() * 2 + 1);
			}
			*(_finish++) = data;
		}

		void pop_back()
		{
			if (_finish == nullptr)
			{
				return;
			}
			--_finish;
		}

		iterator insert(iterator pos, const T& data)
		{
			if (_finish == _end_of_storage)
				reserve(capacity() * 2 + 1);
			auto it = end();
			while (it != pos)
			{
				*it = *(it - 1);
				--it;
			}
			*pos = data;
			++_finish;
			return pos;
		}

		iterator erase(iterator pos)
		{
			auto it = pos;
			while (it != _finish)
			{
				*it = *(it + 1);
				it++;
			}
			--_finish;
			return pos;
		}

		iterator erase(iterator first, iterator end)
		{
			_finish = _start;
		}

		void clear()
		{
			erase(begin(), end());
		}

		void swap(vector<T>& x)
		{
			std::swap(_start, x._start);
			std::swap(_finish, x._finish);
			std::swap(_end_of_storage, x._end_of_storage);
		}

	private:
		T* _start;
		T* _finish;
		T* _end_of_storage;
	};
}


上一篇:对hive sql window function的理解与商业应用


下一篇:mysqlbinlog -v -vv --base64-output参数的区别