vector容器的浅分析

vector是我觉得用起来最舒服的一类容器了,因为它涉及了增删改查等一系列操作,我们只需要了解一下其相应的接口怎么调用即可。整理这篇文章很多参考了柠檬叶子C这位大佬的,参考了侯捷大师翻译的《STL源码剖析》这本书,到时候可以继续补充,今天整理一下,方便查看学习。

目录

vector的构造函数

vector增加元素

 删除元素

遍历元素

判断函数

大小元素

其他常用函数

与vector相关的算法


vector容器也称动态数组,和数组特别相似,但是和c++语言中数组的不同的是,它可以进行动态扩展,内存不足时,找新的更大的内存,拷贝原内容到新内存中,释放原本空间。

vector的构造函数

vector设置了以下几种初始化方式,注意创建的时候要给定相应类型

vector();//无参构造
vector(int n,cosnt& t=0);//创建一个元素为n的容器,数字类型初始化为1
vector(const vector&v);//拷贝构造
vector(begin(),end());//复制另一个容器中begin()到end()直接的值给其初始化(前闭后开)

        vector<int> v1;                             

        vector<int>v2(10,2);

        vector<int>v3(v2);                        

        vector<int>v4(v3.begin(),v3.end());

vector增加元素

vector设置了增加元素的接口,push_back,insert

void push_back(const T&x);//T类型元素插入到尾部
iterator insert(iterator it,const T&x);//在相应迭代器中加入x元素
iterator insert(iterator it,int n,const T &x);相应位置插入n个x
iterator insert(iterator it,const_iterator first,const_iterator last);//左闭右开

举一个例子,如下

#include<iostream>
using namespace std;
#include<vector>
template<typename T>//遍历元素
void ShowVector(vector<T>v)
{
	typename vector<T>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

int main()
{
	vector<float> v;//空容器
	v.push_back(2);
	v.push_back(5);//尾插法插入2,5
	v.insert(v.begin(), 100);//在初始位置插入100
	ShowVector(v);
	cout <<"当前元素个数:"<< v.size() << endl;
	cout<<"vector中其中一个元素的类型: "<<typeid(v[1]).name();
	return 0;
}

 删除元素

vector中设置了删除元素的函数,pop_back,clear,erase函数,

注:iterator是一个迭代器,对于此容器可以认为是指向内部元素的指针

iterator erase(iteator it);//删除it指向的元素
iterator erase(iterator first,iterator last);
void pop_back();//删除尾部
void clear();//删除所有元素

遍历元素

vector中提供相关遍历函数,reference是vector元素的引用

reference at(int n);//返回n的位置,和数组比较类似,n越界抛出异常out_of_range 
reference operator[](int n);//重载[],和数组类似,返回下标元素
reference front();//返回首元素引用
reference back();//尾元素引用
iterator begin();//指向第一个元素的迭代器
iterator end();//最后一个元素的下一个位置
reverse_iterator rbegin();//最后一个元素
reverse_iterator rend();//第一个元素的前面一个

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ignjesy-1628485740296)(/images/C++提高编程.assets/image-20210730104217790.png)]
这个图片比较形象,b站黑马c++入门视频的一个例图,方便了解

判断函数

判断容器是不是空

bool empty()const;//判断是否为空

大小元素

size指当前个数,capacity指当前可用总空间

int size()const;//返回元素的个数
int capacity()const;//返回所能容纳的最大元素的值
int max_size()const;//vector可加入的最大元素个数值

其他常用函数

void swap(vector&v);//交换类型相同容器
void assign(int n,const T&x);//设置前n个元素为x
void assign(const_iterator first,const_iterator last);//赋值
void reserve(int n);//扩容可用,n大于原本的capcity,那么capcity变为n 小于就不变化
void resize(int n,const T&x=0);//大于,扩充size赋值为x,小于则不变相当于删除的剩n个元素

 对resize进行测试 n>capcity,扩容并且赋值, 小于就截取前n个相当于删除了元素

#include<iostream>
using namespace std;
#include<vector>
template<typename T>
void ShowVector(vector<T>v)
{
	typename vector<T>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
int main()
{
	double arr[5] = { 1,2,3,4,5 };//用数组赋值
	vector<double> v(arr+1,arr+5);
	v.push_back(2);
	v.push_back(5);
	ShowVector(v);

	cout <<"当前的size="<< v.size() << endl;
	cout << "当前的capacity=" << v.capacity() << endl;

	v.resize(5);
	cout << endl;
	cout << "resize(5)后的size=" << v.size() << endl;
	cout << "resize(5)后的capacity=" << v.capacity() << endl;
	ShowVector(v);

	v.resize(15);
	cout << endl;
	cout << "resize(15)后的size=" << v.size() << endl;
	cout << "resize(15)后的capacity=" << v.capacity() << endl;
	ShowVector(v);

	v.push_back(100);
	cout << endl;
	cout << "此时加入元素扩容size=" << v.size() << endl;
	cout << "此时加入元素扩容capcity=" << v.capacity() << endl;
	ShowVector(v);

	return 0;
}

对reserve进行测试

n小于capcity时不变化

#include<iostream>
using namespace std;
#include<vector>
template<typename T>
void ShowVector(vector<T>v)
{
	typename vector<T>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
int main()
{
	double arr[5] = { 1,2,3,4,5 };//用数组赋值
	vector<double> v(arr+1,arr+5);
	v.push_back(2);
	v.push_back(5);
	ShowVector(v);

	cout <<"当前的size="<< v.size() << endl;
	cout << "当前的capacity=" << v.capacity() << endl;

	v.reserve(5);
	cout << endl;
	cout << "reserve(5)后的size=" << v.size() << endl;
	cout << "reserve(5)后的capacity=" << v.capacity() << endl;
	ShowVector(v);

	v.reserve(15);
	cout << endl;
	cout << "reserve(15)后的size=" << v.size() << endl;
	cout << "reserve(15)后的capacity=" << v.capacity() << endl;
	ShowVector(v);

	v.push_back(100);
	cout << endl;
	cout << "此时加入元素扩容size=" << v.size() << endl;
	cout << "此时加入元素扩容capcity=" << v.capacity() << endl;
	ShowVector(v);

	v.reserve(8);
	cout << endl;
	cout << "reserve(8)后的size=" << v.size() << endl;
	cout << "reserve(8)后的capacity=" << v.capacity() << endl;
	ShowVector(v);

	return 0;
}

 

与vector相关的算法

加入#include<algorithm>

sort排序算法(默认从小打到)

copy复制算法(可用赋值assign等)

find查询算法

降序算法(可以仿函数,可以先sort算法后reverse)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值