c++标准模板库-vector的常见用法

vector

vector的说明

1.可以用下标索引来访问
2.是一个动态数组,可以存放基本数据类型、结构、类等
3.是一种数据结构(顺序存储的线性表),元素呈线性顺序连续排列,是一种可以自动增加长度的数组。
4.vector分配内存空间时,会比实际所需的多分配一些,使以后插入方便。
5.使用前添加头文件#include <vector>

vector的常见用法

1.vector的初始化
(1)声明一个size为0的vec向量

vector<int> vec;

(2)声明size不为0的vec向量

vector<int> vec1(5); //vec1是定义了的具有5个元素的向量,初值不确定


vector<int> vec2(5,1); //vec2的内容为1,1,1,1,1


vector<int> vec3{ 1, 2, 3, 4, 5 }; //vec3的内容为1,2,3,4,5

(3)用已知向量a给vec向量赋初值

vector<int> vec(a);//用向量a给vec赋值,vec的值和a的值完全相等


vector<int> vec(a.begin(),a.begin+3);//将向量a中从0-2(3个)的元素赋值给vec

(4)通过数组赋初值

int arr[5] = {1, 2, 3, 4, 5};
vector<int> vec(arr, arr + 5); //将arr数组的0-4的元素赋值给ec向量(和vec.end()指针统一)。


vector<int> vec(&arr[0], &arr[4]);

(5)错误的赋值

vector<int>vec;
for(int i=0;i<10;++i){vec[i]=i;}//下标只能用来获取已经存在的元素

2.向vector数组内插入元素。
注:(1)向末尾插入时,可以直接插入,如果预留的空间不够,才会重新分配内存(2)向中间某个位置插入时,由于vector的底层实现还是数组,插入点以后的所有节点都需要重新分配内存。
(1)push_back(同类型)在vector末尾插入新元素

vector<int> vec1;
vec1.push_back(1);


int a[6]={1,2,3,4,5,6,7,8,9,10};
vector<int> b;
vector<int> c(a,a+5);
for(vector::iterator it=c.begin();it<c.end();++it)
{
b.push_back(*it); //从另一个向量中添加
}

(2)insert()第一个参数为迭代器,作用为在迭代器前面插入新元素

vector::iterator it;
it=vec2.begain();
vec2.insert(it,5); //在第一个元素前插入5


vec.insert(vec.begin(),6);//在第一个元素前插入6


vec2.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素


vec2.insert(vec.begin(),2,6);//在第一个元素前插入2两个6


vec.insert(vec.begin()+1,a+2,a+6);//在vec第一个元素前插入a的第三个元素到第五个元素(不包括a+6)

(3)assign()

vec3.assign(2,5); //清除以前的所有元素,加入两个5


vec3.assign(a.begin(),a.begin()+3);//将a的0-2个元素赋值(加入)向量vec3

3.删除元素:
(1)pop_back()删除最后一个元素。

(2)erase()删除指定位置元素。(其中的参数要是指针变量如begain(),end(),及迭代器的值)

vec.erase(vec.begin()+2);//删除第三个元素
vec.erase(a.begin()+1,a.begin()+3);//删除第一个到第二个元素

(3)clear()清除所有元素。

(4)empty()判断该数组是否为空

4.访问与遍历
(1) 以下标访问

vector<int> a;
for(int i = 0; i < a.size(); i++)
{
cout << a[i];
}

(2)以迭代器访问

vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++)
{
cout<<*it<<" " ;
}
cout<<endl;

5.其他
front()访问第一个元素的值
begin()访问第一个元素的地址

back()访问最后一个元素的值
end()访问最后一个元素的地址

size()数组的元素个数
resize(10)数组的元素个数调整至10个,多删少补,值随机

a.swap(b)a中的元素和b中的元素整体交换

6.常用算法
(1)逆序排列

#include <algorithm>
reverse(vec.begin(), vec.end());

(2)排序

//从小到大排序
#include <algorithm>
sort(vec.begin(), vec.end());


//从大到小排序
//(1)法一: reverse函数
//(2)法二:
bool cmp(const int& a, const int& b) {
return a > b;
}
sort(vec.begin(), vec.end(), cmp);

(3)复制

#include <algorithm>
copy(a.begin(),a.end(),b.begin()+1);

(4)查找,若存在返回其在向量中的位置

#include <algorithm>
find(a.begin(),a.end(),10);

题目举例:ccf 202006-2 稀疏向量

#include
#include
using namespace std;

int main()
{
int n,a,b;
int index,value;
cin>>n>>a>>b;
vector< pair<int,int> > u,v; //重点重点!
for(int i=0;i<a;i++)
{
cin>>index>>value;
u.push_back({index,value}); //注意这种添加格式
}
for(int j=0;j<b;j++)
{
cin>>index>>value;
v.push_back({index,value});
}
long long sum=0;//求内积相乘可能超过int范围
int i=0,j=0;
while(i<a && j<b) //这样比两个for双重循环的时间复杂度低
{
if(u[i].first==v[j].first)
{
sum+=u[i].second*v[j].second;
i++;
j++;
}
else if(u[i].first<v[j].first)
i++;
else
j++;
}
cout<<sum;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值