【C++】STL之vector功能及模拟实现

目录

前沿

一、vector的使用

 1、vector 构造函数的声明

 2、vector 迭代器的使用

 3、vector 空间增长问题

 4、vector 的增删查改

二、vector的模拟实现

 1、vector 的成员变量

 2、迭代器

 3、容量相关(resize, reserve)

 4、数据访问相关

 5、插入删除

  5.1 任意位置插入

  5.2 任意位置删除

  5.3 尾插

  5.4 尾删

 6、析构函数

 7、交换函数

 8、构造函数

  8.1 无参构造

  8.2 实参构造

  8.3 迭代器区间构造

  8.4 实参构造的特例化

  8.5 拷贝构造

 9、赋值运算符重载

三、vector迭代器失效问题(重点)

  1、会引起其底层空间改变的操作,都有可能是迭代器失效。

  2、 指定位置元素的删除操作–erase

四、使用memcpy拷贝问题


前沿

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是 一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存 储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是 对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增 长。
  6. 与其它动态序列容器相比(deque, list and forward_list),vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起 list 和 forward_list 统一的迭代器和引用更好。

一、vector的使用

 1、vector 构造函数的声明

(constructor)构造函数声明 接口说明
vector(); 无参构造
vector (size_type n, const value_type& val = value_type()); 构造并初始化n个val
vector (const vector& x); 拷贝构造
vector (InputIterator first, InputIterator last); 使用迭代器进行初始化构造
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;
	vector<int> v2(5, 0);
	vector<int> v3(v2);
	vector<int> v4(v2.begin(), v2.end());

	return 0;
}

调试结果如下:

 2、vector 迭代器的使用

iterator的使用 接口说明
begin + end 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator
rbegin + rend 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

 对于 vector 迭代器的使用,主要是遍历 vector,在这里有两种遍历方法:一种是按数组下标方式,另一种是通过范围 for 的方式(底层也是迭代器)。

int main()
{
	vector<int> v(5, 1);
	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;
	return 0;
}

运行结果如下:

 3、vector 空间增长问题

容量空间 接口说明
size 获取数据个数
capacity 获取容量大小
empty 判断是否为空
resize 改变vector的size
reserve 改变vector的capacity

  这一块主要是 resize 和 reserve 函数接口的使用。

  首先介绍一下 vs 下 vector 的扩容机制 :capacity 是按 1.5 倍增长的,而 g++ 是按 2 倍增长的。

//测试vector的默认扩容机制
void TestVectorExpand()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	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';
		}
	}
}

运行结果:

  resize 的使用:

int main()
{
	vector<int> v;
	for (int i =
评论 150
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

x一季花开成海x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值