一、vector常用
vector容器单端动态数组,支持随机访问,在堆区申请的空间。
0.API
//构造函数
vector<T> v;
vector(n,num); //n个num
vector(const vector &vec);//拷贝构造
vector(v.begin(),v.end()); //
//例:
vector<int> v1(5,1);
vector<int> v2 = v1;
vector<int> v3(v1.begin(),v1.end())
//赋值操作:区间赋值、n个元素赋值、等号赋值(重载等号运算符)
vector<int> v4;
//v4 = v3;
v4.assign(6,2);
//交换--长度不同也可以交换
v3.swap(v4);
//empty() 是否为空,为空返回真
//重置大小
vector<int> v5(2,10); // 10 10
//v5.resize(5); //过大补零 10 10 0 0 0
//v5.resize(5,20); //过大补resize中的值 10 10 20 20 20 ,容量不够扩容
//v5.resize(1); //过小删除,容量不变 10
//reserve() 预留空间,提前给定空间容量大小
//访问元素
vector<int> v6 = {1,2,3,4,5};
//访问第0个元素,其中at越界抛出异常,[]则不会,也可修改元素
cout<<v6.at(0);
cout<<v6[0];
v6.at(0) = 10;
v6[1] = 20; //10 20 3 4 5
1.sort函数
代码如下(示例):
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(const int& a,const int& b)
{
//默认return a<b 从小到大
return a>b;
}
struct jyStruct
{
int a,b;
};
bool jyCmp(const jyStruct& a, const jyStruct& b)
{
return a.a<b.a; //a.a<b.a返回真,即将结构体按照变量a从小到大进行排序
}
static bool vecCmp(const vector<int>& a,vector<int>& b)
{
if(a[0] == b[0])
return a[1]<b[1];
return a[0]>b[0]; //按照第一个元素从大到小排序,相同按照第二个元素从小到大排序
}
int main(int argc,char** argv)
{
//打印输出vector中的元素
vector<int> v1 ={1,3,2,6,5};
for(int i:v1)
{
cout<<i<<" "; // 1,3,2,6,5
}
sort(v1.begin(),v1.end()); //默认第三个参数省略,按照从小到大的顺序排列;
//打印输出结果为1,2,3,5,6
sort(v1.begin(),v1.end(),cmp);//第三个参数cmp函数,a>b时返回真,从大到小排序
//打印输出结果:6,5,3,2,1
jyStruct x, y;
x.a = 1;
x.b = 2;
y.a = 2;
y.b = 1;
vector<jyStruct> v2; //v2 = {x,y}
v2.push_back(x);
v2.push_back(y);
sort(v2.begin(), v2.end(),jyCmp);
for(int i=0;i<2;i++)
{
cout<<v2[i].a<<" "<<v2[i].b<<" "<<endl;
} //输出结果:1 2
// 2 1
vector<vector<int>> v3;
v3 = { {7,0} ,{4,4},{7,1},{5,0},{6,1},{5,2} };
for (int i = 0; i < 6; i++)
{
cout <<"["<<v3[i][0] <<","<<v3[i][1]<<"]"; //[7,0] [7,1] [6,1] [5,0] [5,2] [4,4]
}
return 0;
}
2.insert函数
代码如下(示例):
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v4 = {1,3,2,5,4};
v4.insert(v4.begin(), 9); //在最前面插入元素 9,1,3,2,5,4
v4.insert(v4.begin()+2, 9); //在迭代器第二个元素前插入元素 1,3,9,2,5,4
v4.insert(v4.end(), 9); //在末尾插入元素 1,3,2,5,4,9
v4.insert(v4.end(), 3,9); //在末尾插入3个9 1,3,2,5,4,9,9,9
//这里的3个9可以是数组中元素,例如,数组q[]={1,2,3},可以插入q[1]个q[2]
vector<int> v5 = { 6,7,8 };
v4.insert(v4.end(), v5.begin(), v5.end()); //连接两个vector,v4后面插入v5 1,3,2,5,4,6,7,8
return 0;
}
3.erase()函数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//每次运行STL函数假定v没有被处理过
int main()
{
vector<int> v{1,3,3,3,3,5};
v.erase(v.begin(), v.begin() + 1); //移除指定区间的元素, 3,3,3,3,5
v.erase(v.begin()+1); //移除指定位置的元素 1,3,3,3,5
v.erase(v.begin()+1,v.begin()+ 5); //删除容器中的3,右边不包含,所以到下一个位置 1 5
// remove(v.begin(), v.end(), 3); //单独的remove函数(STL中的函数)将区间内为val的元素移到v的末尾,并没有删除,返回的是未指定删除元素的最后一个迭代器,需要配合erase()使用
v.erase( remove(v.begin(), v.end(), 3),v.end()); //{1 5}
//unique(start,end,pred) 去重函数,需要将容器排序,(去重起点的迭代器位置,去重终点迭代器位置[不包括],自定义判断去重方式)
vector<int>::iterator pos = unique(v.begin(),v.end()); //返回容器中没有重复元素的下一个位置的迭代器
v.erase(pos,nums.end()); //1,3,5
}
4.swap缩小空间
vector<int> v1;
v1.reserve(1000); //容量1000
v1.assign(5,100);
vector<int>(v1).swap(v1) //容量5 匿名对象