vector是我觉得用起来最舒服的一类容器了,因为它涉及了增删改查等一系列操作,我们只需要了解一下其相应的接口怎么调用即可。整理这篇文章很多参考了柠檬叶子C这位大佬的,参考了侯捷大师翻译的《STL源码剖析》这本书,到时候可以继续补充,今天整理一下,方便查看学习。
目录
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();//第一个元素的前面一个
这个图片比较形象,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)