Vector的使用

vector在日常的使用非常广泛,我们应该熟悉它的常用接口。接下来我们从基础的接口开始,学会它的使用及模拟实现。

vector模拟实现的基本结构:

代码语言:javascript

AI代码解释

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

	//无参构造
	vector()
		:_start(nullptr)	//数组首地址
		, _finish(nullptr)	//当前末尾元素的下一个地址
		, _endofstoage(nullptr)	//当前分配空间的下一地址
	{
	}

	//资源管理
	~vector()
	{
		if (_start)
		{
			delete[] _start;
			_start = _finish = _endofstoage = nullptr;
		}
	}


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


	size_t capacity() const
	{
		return _endofstoage - _start;
	}
private:
	iterator _start;
	iterator _finish;
	iterator _endofstoage;
};
2.1. vector的定义

构造函数声明constructor

接口说明

vector() (重点)

无参构造

vector (const vector& x); (重点)

拷贝构造

vector ( size_type n, const value_type& val = value_type() )

构造并初始化 n 个 val

vector (InputIterator first, InputIterator last);

使用迭代器进行初始化构造

代码语言:javascript

AI代码解释

//无参构造
vector()
	:_start(nullptr)
	, _finish(nullptr)
	, _endofstoage(nullptr)
{}
 
//拷贝构造
void swap(vector<T>& v)
{
	std::swap(_start, v._start);
	std::swap(_finish, v._finish);
	std::swap(_endofstoage, v._endofstoage);
}
 
//vector(const vector& v)
vector(const vector<T>& v)
	:_start(nullptr)
	, _finish(nullptr)
	, _endofstoage(nullptr)
{
	vector tmp(v.begin(), v.end());
	swap(tmp);
}
 
//初始化n个val 
vector(size_t n, const T& val = T())
	:_start(nullptr)
	, _finish(nullptr)
	, _endofstoage(nullptr)
{
	reserve(n);
	for (size_t i = 0; i < n; ++i)
	{
		push_back(val);
	}
}
 
//使用迭代化区间初始化
template <class InputIterator>
vector(InputIterator first, InputIterator last)
	:_start(nullptr)
	, _finish(nullptr)
	, _endofstoage(nullptr)
{
	while (first != last)
	{
		push_back(*first);
		++first;
	}
}

2.2. vector迭代器的使用

iterator的使用

接口说明

begin+end (重点)

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

rbegin+rend(反向迭代器)

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

代码语言:javascript

AI代码解释

iterator begin()
{
	return _start;
}
iterator end()
{
	return _finish;
}
 
const iterator begin() const
{
	return _start;
}
const iterator end() const
{
	return _finish;
}

2.3. vector的空间增长问题

容量空间

接口说明

size

获取数据个数

capacity

获取容量大小

empt

判断是否为空

resize(重点)

改变 vector 的 size

reserve(重点)

改变 vector 的 capacity

Logo

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

更多推荐