一. vector 底层核心:三指针控制内存

vector 的本质是动态管理连续内存的容器,其核心通过三个指针(迭代器)控制内存块:

  • _start :指向内存块的起始位置(第一个元素的地址);
  • _finish:指向有效元素的末尾(最后一个元素的下一位);
  • _end_of_storage:指向内存块的末尾(容量的边界)。

代码语言:javascript

AI代码解释

namespace Lotso
{
	template<class T>
	class vector
	{
public:
	    //typedef T* iterator;
	    using iterator = T*;
	    using const_iterator = const T*;
private:
		iterator _start = nullptr;//数据起始位置
		iterator _finish = nullptr;//有效数据
		iterator _end_of_storage = nullptr;//空间
	};
}

通过这三个指针,可直接计算:

  • 有效元素个数(size):_finish - _start
  • 容量(capacity):_end_of_storage - _start

代码语言:javascript

AI代码解释

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

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

二. 迭代器设计:连续内存的 “天然优势”

  • vector的迭代器是对原生指针的封装,支持随机访问等操作,是很好用的
迭代器类型定义:

代码语言:javascript

AI代码解释

public:
	//typedef T* iterator;
	using iterator = T*;
	using const_iterator = const T*;

	iterator begin()
	{
		return _start;
	}

	iterator end()
	{
		return _finish;
	}

	const_iterator begin() const
	{
		return _start;
	}

	const_iterator end() const
	{
		return _finish;
	}

--我们这里迭代器的使用可以测试一下,实现的打印函数我就直接放上去了,之前讲过

  • test.c:

代码语言:javascript

AI代码解释

namespace Lotso
{
	void Print(const vector<int>& v)
	{
		for (auto e : v)
		{
			cout << e << " ";
		}
		cout << endl;

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

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

		v[0]++;

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

int main()
{
	Lotso::test_vector1();

	return 0;
}


三. 核心接口实现:从构造到析构的内存管理

3.1 构造与析构:vector的基础框架

--我们这里主要介绍一下无参构造,其它的就不多讲了

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐