【C++】vector 基本使用(详解)

目录

一,vector 的介绍

二,vector 的定义

1,vector()

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

3,vector (const vector& x)

4,vector (InputIterator first, InputIterator last);

三,vector iterator 的使用

1,begin + end

2,rbegin + rend 

四,vector 空间增长问题

1,size

2,capacity

3,empty

4,reserve

5,resize

五,vector 增删查改

1,push_back

2,pop_back 

3,find

4,insert

5,erase

6,swap

7,operator[]


一,vector 的介绍

1,vector 是表示可变大小数组的序列容器。

2,就像数组一样,vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector 的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

3,本质讲,vector 使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector 并不会每次都重新分配大小。

4,vector 分配空间策略:vector 会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

5,因此,vector 占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。

6,与其它动态序列容器相比(deque, list and forward_list), vector 在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起listforward_list 统一的迭代器和引用更好。

二,vector 的定义

1,vector()

无参构造

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

int main()
{
	vector<int> v1;
	return 0;
}

这里我们定义一个 vector 类,它里面的各种数据都是初始化了的,不是空就是0;

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

构造并初始化 n 个 val

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

int main()
{
	vector<int> v1(5, 6);
	for (int i = 0; i < 5; i++)
	{
		cout << v1[i]<<" ";
	}

	return 0;
}

直接自己定义初始化成 n 个 val;

3,vector (const vector& x)

拷贝构造

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

int main()
{
	vector<int> v1(5, 6);
	vector<int> v2(v1);
	for (int i = 0; i < 5; i++)
	{
		cout << v2[i]<<" ";
	}

	return 0;
}

拷贝构造嘛,都老朋友了;

4,vector (InputIterator first, InputIterator last);

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

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

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

	vector<int> v2(v1.begin()+1, v1.end()-1);
	for (int i = 0; i < 3; i++)
	{
		cout << v2[i] << " ";
	}

	return 0;
}

迭代器进行初始化构造,就是选取一段范围进行拷贝;

三,vector iterator 的使用

1,begin + end

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

2,rbegin + rend 

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

诸位爱卿,我相信这张图对汝等足矣!

四,vector 空间增长问题

1,size

获取数据个数

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

int main()
{
	vector<int> v1(5, 6);
	cout << v1.size();

	return 0;
}

获取有效数据个数,不等同于容量,只是数据个数;

2,capacity

获取容量大小

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

int main()
{
	vector<int> v1(5, 6);
	cout << v1.capacity();

	return 0;
}

查看空间容量的,不等同于数据个数;

3,empty

判断是否为空,为空返回真,不为空返回 0;

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

int main()
{
	vector<int> v1(5, 6);
	vector<int> v2;
	cout << v1.empty()<<" "<<v2.empty();

	return 0;
}

4,reserve

改变 vector 的 capacity

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

int main()
{
	vector<int> v1(5, 6);
	cout << v1.capacity() << endl;

	v1.reserve(50);
	cout << v1.capacity() << endl;

	v1.reserve(20);
	cout << v1.capacity() << endl;

	v1.reserve(3);
	cout << v1.capacity() << endl;

	return 0;
}

兄弟们自己找找规律; 

5,resize

改变 vector 的 size

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

int main()
{
	vector<int> v1(5, 6);
	cout << v1.size() << " " << v1.capacity() << endl;

	v1.resize(20);
	cout << v1.size() << " " << v1.capacity() << endl;

	v1.resize(10);
	cout << v1.size() << " " << v1.capacity() << endl;

	return 0;
}

size()的值与 capacity 的值息息相关的,当 size()大于 capacity 时,capacity 会增大扩容;

五,vector 增删查改

1,push_back

尾插

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

int main()
{
	vector<int> v1(5, 6);
	v1.push_back(7);
	v1.push_back(8);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i]<<" ";
	}
	return 0;
}

2,pop_back 

尾删

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

int main()
{
	vector<int> v1(5, 6);
	v1.pop_back();
	v1.pop_back();
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i]<<" ";
	}
	return 0;
}

3,find

查找。(注意这个是算法模块实现,不是 vector 的成员接口)

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(),v1.end(), 3);
	cout << *pos << endl;

	pos = find(v1.begin(), v1.end(), 5);
	cout << *pos;
	return 0;
}

在一个特点的范围里寻找一个数,然后返回指向这个数的迭代器;

4,insert

在 position 之前插入 val

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(),v1.end(), 3);
	cout << *pos << endl;
	v1.insert(pos, 66);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}

在指定位置前插入特定的数;

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(),v1.end(), 3);
	cout << *pos << endl;

	v1.insert(pos, 3, 77);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	return 0;
}

在指定位置前插入指定数量的数;

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(),v1.end(), 3);
	cout << *pos << endl;

	v1.insert(pos, v1.begin(), v1.begin() + 2);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}

	return 0;
}

在指定位置前插入一段区间;

5,erase

删除 position 位置的数据

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(), v1.end(), 3);
	cout << *pos << endl;
	
	v1.erase(pos);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}

删除某个指定位置的数据;

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };

	v1.erase(v1.begin(),v1.end()-1);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}

删除指定一段区间的数据;

6,swap

交换两个 vector 的数据空间

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

int main()
{
	vector<int> v1{ 0,1,2,3,4 };
	vector<int> v2{ 5,6,7,8,9 };

	v1.swap(v2);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v2[i] << " ";
	}
	return 0;
}

直接交换两边的数据;

7,operator[]

像数组一样访问

这个我们已经很熟悉了;

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

int main()
{
	vector<int> v1{ 0,1,2,3,4 };
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}

评论 61
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

手法king

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

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

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

打赏作者

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

抵扣说明:

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

余额充值