《C++ vector 完全指南:vector的模拟实现》

发布于:2025-07-26 ⋅ 阅读:(17) ⋅ 点赞:(0)

《C++ vector 完全指南:vector的模拟实现》



一、定义vector的成员变量

vector的成员变量是三个迭代器,也可以说是三个指针。
在这里插入图片描述
在这里插入图片描述


二、用vector实现动态二维数组

在这里插入图片描述
在这里插入图片描述


三、vector的接口实现

1.vector的默认成员函数

(1)构造函数实现

我们就依次实现下面四种构造方式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


(2)析构函数实现

这里要注意对_start判空,因为空的时候就不用再析构!
在这里插入图片描述


(3)拷贝构造函数

这里也可以是构造函数,也是拷贝构造函数!
在这里插入图片描述


(4)赋值运算符重载

这里直接选择swap交换函数就OK
在这里插入图片描述


2.vector的迭代器实现

vector中迭代器iterator就是一个指针。所以我们直接使用typedef实现即可
begin()和end()本质上都是指针
在这里插入图片描述


3.vector的容量操作函数

size()、capacity()、clear()、empty()都很简单!一看就懂!
在这里插入图片描述


reverse()和string实现差不多,只要新容量大于旧容量就发生扩容!
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


4.vector的访问操作函数

这里面主要就是 数组的下表访问[ ]
在这里插入图片描述


5.vector的修改操作函数

这里面有:push_back 、 pop_back 、 insert 、 earse
push_back要考虑扩容的问题,前两个比较简单
在这里插入图片描述
在这里插入图片描述在这里插入图片描述


整体源代码介绍

vector.h

代码如下(示例):

#pragma once
#include<assert.h>
#include<list>
#include<string>

namespace bit
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;

		vector()
		{}

		// C++11 前置生成默认构造
		vector() = default;

		vector(const vector<T>& v)
		{
			reserve(v.size());
			for (auto& e : v)
			{
				push_back(e);
			}
		}

		// 类模板的成员函数,还可以继续是函数模版
		template <class InputIterator>
		vector(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				push_back(*first);
				++first;
			}
		}

		vector(size_t n, const T& val = T())
		{
			reserve(n);
			for (size_t i = 0; i < n; i++)
			{
				push_back(val);
			}
		}

		vector(int n, const T& val = T())
		{
			reserve(n);
			for (int i = 0; i < n; i++)
			{
				push_back(val);
			}
		}

		void clear()
		{
			_finish = _start;
		}

		// v1 = v3
		//vector<T>& operator=(const vector<T>& v)
		//{
		//	if (this != &v)
		//	{
		//		clear();

		//		reserve(v.size());
		//		for (auto& e : v)
		//		{
		//			push_back(e);
		//		}
		//	}

		//	return *this;
		//}

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

		// v1 = v3
		//vector& operator=(vector v)
		vector<T>& operator=(vector<T> v)
		{
			swap(v);

			return *this;
		}

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

		iterator begin()
		{
			return _start;
		}

		iterator end()
		{
			return _finish;
		}

		const_iterator begin() const
		{
			return _start;
		}

		const_iterator end() const
		{
			return _finish;
		}

		void reserve(size_t n)
		{
			if (n > capacity())
			{
				size_t old_size = size();
				T* tmp = new T[n];
				//memcpy(tmp, _start, old_size * sizeof(T));
				for (size_t i = 0; i < old_size; i++)
				{
					tmp[i] = _start[i];
				}
				delete[] _start;

				_start = tmp;
				_finish = tmp + old_size;
				_end_of_storage = tmp + n;
			}
		}

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

		size_t size() const
		{
			return _finish - _start;
		}

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

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

		void push_back(const T& x)
		{
			// 扩容
			if (_finish == _end_of_storage)
			{
				reserve(capacity() == 0 ? 4 : capacity() * 2);
			}

			*_finish = x;
			++_finish;
		}

		void pop_back()
		{
			assert(!empty());
			--_finish;
		}

		iterator insert(iterator pos, const T& x)
		{
			assert(pos >= _start);
			assert(pos <= _finish);

			// 扩容
			if (_finish == _end_of_storage)
			{
				size_t len = pos - _start;
				reserve(capacity() == 0 ? 4 : capacity() * 2);
				pos = _start + len;
			}

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

			++_finish;

			return pos;
		}

		void erase(iterator pos)
		{
			assert(pos >= _start);
			assert(pos < _finish);

			iterator it = pos + 1;
			while (it != end())
			{
				*(it - 1) = *it;
				++it;
			}

			--_finish;
		}

		T& operator[](size_t i)
		{
			assert(i < size());

			return _start[i];
		}

		const T& operator[](size_t i) const
		{
			assert(i < size());

			return _start[i];
		}

	private:
		iterator _start = nullptr;
		iterator _finish = nullptr;
		iterator _end_of_storage = nullptr;
	};

	/*void print_vector(const vector<int>& v)
	{
		vector<int>::const_iterator it = v.begin();
		while (it != v.end())
		{
			cout << *it << " ";
			++it;
		}
		cout << endl;

		for (auto e : v)
		{
			cout << e << " ";
		}
		cout << endl;
	}*/

	template<class T>
	void print_vector(const vector<T>& v)
	{
		// 规定,没有实例化的类模板里面取东西,编译器不能区分这里const_iterator
		// 是类型还是静态成员变量
		//typename vector<T>::const_iterator it = v.begin();
		auto it = v.begin();
		while (it != v.end())
		{
			cout << *it << " ";
			++it;
		}
		cout << endl;

		for (auto e : v)
		{
			cout << e << " ";
		}
		cout << endl;
	}

	template<class Container>
	void print_container(const Container& v)
	{
		/*auto it = v.begin();
		while (it != v.end())
		{
			cout << *it << " ";
			++it;
		}
		cout << endl;*/

		for (auto e : v)
		{
			cout << e << " ";
		}
		cout << endl;
	}

	void test_vector1()
	{
		vector<int> v;
		v.push_back(1);
		v.push_back(2);
		v.push_back(3);
		v.push_back(4);
		v.push_back(5);

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

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

		for (auto e : v)
		{
			cout << e << " ";
		}
		cout << endl;

		print_vector(v);

		vector<double> vd;
		vd.push_back(1.1);
		vd.push_back(2.1);
		vd.push_back(3.1);
		vd.push_back(4.1);
		vd.push_back(5.1);

		print_vector(vd);
	}

	void test_vector2()
	{
		std::vector<int> v;
		v.push_back(1);
		v.push_back(2);
		v.push_back(3);
		v.push_back(4);
		v.push_back(5);

		print_container(v);

		/*v.insert(v.begin() + 2, 30);
		print_vector(v);*/

		int x;
		cin >> x;
		auto p = find(v.begin(), v.end(), x);
		if (p != v.end())
		{
			// insert以后p就是失效,不要直接访问,要访问就要更新这个失效的迭代器的值
			/*v.insert(p, 20);
			(*p) *= 10;*/

			p = v.insert(p, 40);
			(*(p + 1)) *= 10;
		}
		print_container(v);
	}

	void test_vector3()
	{
		std::vector<int> v;
		v.push_back(1);
		v.push_back(2);
		v.push_back(3);
		v.push_back(4);

		print_container(v);

		// 删除所有的偶数
		auto it = v.begin();
		while (it != v.end())
		{
			if (*it % 2 == 0)
			{
				it = v.erase(it);
			}
			else
			{
				++it;
			}
		}

		print_container(v);
	}

	void test_vector4()
	{
		int i = int();
		int j = int(1);
		int k(2);

		vector<int> v;
		v.resize(10, 1);
		v.reserve(20);

		print_container(v);
		cout << v.size() << endl;
		cout << v.capacity() << endl;

		v.resize(15, 2);
		print_container(v);

		v.resize(25, 3);
		print_container(v);

		v.resize(5);
		print_container(v);
	}

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

		vector<int> v2 = v1;
		print_container(v2);

		vector<int> v3;
		v3.push_back(10);
		v3.push_back(20);
		v3.push_back(30);

		v1 = v3;
		print_container(v1);
		print_container(v3);
	}

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

		vector<int> v2(v1.begin(), v1.begin() + 3);
		print_container(v1);
		print_container(v2);

		list<int> lt;
		lt.push_back(10);
		lt.push_back(10);
		lt.push_back(10);
		lt.push_back(10);
		vector<int> v3(lt.begin(), lt.end());
		print_container(lt);
		print_container(v2);

		vector<string> v4(10, "1111111");
		print_container(v4);

		vector<int> v5(10);
		print_container(v5);

		vector<int> v6(10u, 1);
		print_container(v6);

		vector<int> v7(10, 1);
		print_container(v7);
	}

	void test_vector7()
	{
		vector<string> v;
		v.push_back("11111111111111111111");
		v.push_back("11111111111111111111");
		v.push_back("11111111111111111111");
		v.push_back("11111111111111111111");
		print_container(v);

		v.push_back("11111111111111111111");
		print_container(v);
	}
}

Test.cpp

代码如下(示例):

#include<iostream>
#include<vector>
using namespace std;

#include"vector.h"

void test_vector1()
{
	vector<int> v1;
	vector<int> v2(10, 1);

	vector<int> v3(++v2.begin(), --v2.end());

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

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

	for (auto e : v3)
	{
		cout << e << " ";
	}
	cout << endl;
}


void TestVectorExpand()
{
	size_t sz;
	vector<int> v;
	v.reserve(100);

	sz = v.capacity();
	cout << "capacity changed: " << sz << '\n';

	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

void test_vector2()
{
	//TestVectorExpand();

	vector<int> v(10, 1);
	v.reserve(20);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.reserve(15);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.reserve(5);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
}

void test_vector3()
{
	//TestVectorExpand();

	vector<int> v(10, 1);
	v.reserve(20);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.resize(15, 2);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.resize(25, 3);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	v.resize(5);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
}

void test_vector4()
{
	vector<int> v(10, 1);
	v.push_back(2);
	v.insert(v.begin(), 0);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	v.insert(v.begin() + 3, 10);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int> v1(5, 0);
	for (size_t i = 0; i < 5; i++)
	{
		cin >> v1[i];
	}

	for (auto e : v1)
	{
		cout << e << ",";
	}
	cout << endl;

	vector<char> v2;
	string s2;
	// \0

	vector<int> v3;
	// send(s2.c_str())
}

void test_vector5()
{
	vector<int> v(5, 1);
	vector<vector<int>> vv(10, v);
	vv[2][1] = 2;
	// vv.operator[](2).operator[](1) = 2;
	for (size_t i = 0; i < vv.size(); i++)
	{
		for (size_t j = 0; j < vv[i].size(); ++j)
		{
			cout << vv[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}
int main()
{
	test_vector5();
}

//template<class T>
//class vector
//{
//	T& operator[](int i)
//	{
//		assert(i < _size);
//
//		return _a[i];
//	}
//private:
//	T* _a;
//	size_t _size;
//	size_t _capacity;
//};

// vector<int>
//class vector
//{
//	int& operator[](int i)
//	{
//		assert(i < _size);
//
//		return _a[i];
//	}
//private:
//	int* _a;
//	size_t _size;
//	size_t _capacity;
//};
//
//// vector<vector<int>>
//class vector
//{
//	vector<int>& operator[](int i)
//	{
//		assert(i < _size);
//
//		return _a[i];
//	}
//private:
//	vector<int>* _a;
//	size_t _size;
//	size_t _capacity;
//};

//int main()
//{
//	bit::test_vector7();
//
//	return 0;
//}
//using namespace std;
//#include<vector>
//void Test1()
//{
//	vector<int> v = { 1,2,3,4,5,6,7,8 };
//	vector<int>::iterator it = v.begin();
//	cout << "顺序遍历:";
//	while (it != v.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//	cout << "逆序遍历:";
//	vector<int>::reverse_iterator rit = v.rbegin();
//	while (rit != v.rend())
//	{
//		cout << *rit << " ";
//		++rit;
//	}
//}
//void Test2()
//{
//	//1.默认构造函数初始化
//	vector<int> v1;
//	//2.n个val初始化
//	vector<int> v2(3, 2);
//	string s("abcd");
//	//3.利用迭代器区间初始化
//	vector<int> v3(s.begin(), s.end());
//	//4.拷贝构造
//	vector<int> v4(v3);
//	//5.赋值重载
//	v2 = v3;
//	//6.可变参数列表初始化
//	vector<int> v5 = { 1,2,3,4,5 };
//	//vector<char> v6 = v4;//error 不同类型不能赋值
//}
//void Test3()
//{
//	vector<int> v = { 1,2,3,4,5 };
//	cout << v.size() << endl;
//	cout << v.capacity() << endl;
//}
//void TestExpand()
//{
//	size_t sz;
//	vector<int> v;
//	sz = v.capacity();
//	cout << "making v grow:" << endl;
//	for (int i = 0; i < 100; ++i)
//	{
//		v.push_back(i);
//		if (sz != v.capacity())
//		{
//			sz = v.capacity();
//			cout << "capacity changed: " << sz << endl;
//		}
//	}
//}
//void Test4()
//{
//	vector<int> v1 = { 1,2,3,4,5 };
//	cout << "v1的有效长度为:" << v1.size() << endl;
//	cout << "v1的容量大小为:" << v1.capacity() << endl;
//	v1.reserve(10);
//	cout << "v1的有效长度为:" << v1.size() << endl;
//	cout << "v1的容量大小为:" << v1.capacity() << endl;
//	v1.resize(8, 10);
//	for (auto& e : v1)
//	{
//		cout << e << " ";
//	}
//}
//// error
////因为reserve只是改变了容量capacity并没有改变size,
////而operator[]访问时元素时是禁止访问下标size以后的元素的,一旦访问就会直接报错
//void Test5()
//{
//	vector<int> v;
//	v.reserve(10);
//	for (int i = 0; i < 10; i++)
//	{
//		v[i] = i;
//	}
//	for (auto& e : v)
//	{
//		cout << e << " ";
//	}
//}
//void Test6()
//{
//	vector<int> v = { 1,2,3,4,5 };
//	for (int i = 0; i < v.size(); i++)
//	{
//		cout << v[i] << " ";
//	}
//	cout << endl;
//	cout << "front:" << v.front() << endl;
//	cout << "back:" << v.back() << endl;
//}
//void Test7()
//{
//	vector<int> v = { 1,2,3,4,5,6 };
//	cout << "back:" << v.back() << endl;
//	//尾插
//	v.push_back(7);
//	//尾删
//	cout << "back:" << v.back() << endl;
//	v.pop_back();
//	cout << "back:" << v.back() << endl;
//	vector<int> vv = { 6,5,4,3,2,1 };
//	//n个val赋值给原数组
//	vv.assign(3, 2);
//	for (int i = 0; i < vv.size(); i++)
//	{
//		cout << vv[i] << " ";
//	}
//	cout << endl;
//	vv.swap(v);
//	for (int i = 0; i < v.size(); i++)
//	{
//		cout << v[i] << " ";
//	}
//	cout << endl;
//	for (int i = 0; i < vv.size(); i++)
//	{
//		cout << vv[i] << " ";
//	}
//}
//void Test8()
//{
//	vector<int> myvector(3, 100);
//	vector<int>::iterator it = myvector.begin();
//	//1.向指定位置插入一个元素
//	it = myvector.insert(it, 200);
//	cout << "myvector contains:";
//	for (it = myvector.begin(); it < myvector.end(); it++)
//		cout << ' ' << *it;
//	cout << endl;
//	//2.向指定位置插入n个元素
//	myvector.insert(it, 2, 300);
//	cout << "myvector contains:";
//	for (it = myvector.begin(); it < myvector.end(); it++)
//		cout << ' ' << *it;
//	cout << endl;
//	//3.向指定位置插入一段迭代器区间
//	it = myvector.begin();
//	vector<int> anothervector(2, 400);
//	cout << "myvector contains:";
//	for (it = myvector.begin(); it < myvector.end(); it++)
//		cout << ' ' << *it;
//	cout << endl;
//	it = myvector.begin();
//	myvector.insert(it + 2, anothervector.begin(), anothervector.end());
//	//4.向指定位置插入一段迭代器区间
//	int myarray[] = { 501,502,503 };
//	myvector.insert(myvector.begin(), myarray, myarray + 3);
//	cout << "myvector contains:";
//	for (it = myvector.begin(); it < myvector.end(); it++)
//		cout << ' ' << *it;
//	cout << endl;
//}
//void Test9()
//{
//	//1.删除迭代器所指元素
//	vector<int> myvector;
//	for (int i = 1; i <= 10; i++)
//		myvector.push_back(i);
//	vector<int>::iterator it = myvector.erase(myvector.begin() + 5);
//	it = myvector.erase(it);
//	//2.删除一段迭代器区间
//	it = myvector.erase(myvector.begin(), myvector.begin() + 3);
//	cout << "myvector contains:";
//	for (int i = 0; i < myvector.size(); ++i)
//		cout << ' ' << myvector[i];
//	cout << endl;
//}
////int main()
////{
////	//Test3();
////	//TestExpand();
////	//Test4();
////	//Test5();
////	//Test6();
////	//Test7();
////	//Test8();
////	Test9();
////}
//
//int main()
//{
//	vector<int> v{ 1,2,3,4,5,6 };
//	auto it = v.begin();
//	v.assign(100, 8);
//	while (it != v.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//	return 0;
//}


网站公告

今日签到

点亮在社区的每一天
去签到