VECTOR 自学笔记
VECTOR 自学笔记
首先我们先从STL讲起。
STL是一种容器,分类如下图:
这些容器都有一些共有函数,如下:
=:有赋值运算符以及复制构造函数。
begin():返回指向开头元素的迭代器。
end():返回指向末尾的下一个元素的迭代器。end() 不指向某个元素,但它是末尾元素的后继。
size():返回容器内的元素个数。
max_size():返回容器 理论上 能存储的最大元素个数。依容器类型和所存储变量的类型而变。
empty():返回容器是否为空。
swap():交换两个容器。
clear():清空容器。
vector、list、deque、set、map都是容器
讲回vector:
vector容器基本概念
vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。
array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。
vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个大块头的array了。
vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率,一旦vector旧空间满了,如果客户每新增一个元素,vector内部只是扩充一个元素的空间,实为不智,因为所谓的扩充空间(不论多大),一如刚所说,是”配置新空间-数据移动-释放旧空间”的大工程,时间成本很高,应该加入某种未雨绸缪的考虑,稍后我们便可以看到vector的空间配置策略。
(所以日常用vector QUQ)
vector 常用迭代器和遍历方法
数组名称begin()
返回首元素的迭代器——地址
数组名称.end()
返回最后一个元素的后一个位置的迭代器——地址
数组名称.empty()
判断是否为空,空则返回真,反之返回假
数组名称.push_back()
在尾部插入值
数组名称.pop_back()
删除最后一个值
数组名称.clear()
删除所有元素(不是真删除!!)
数组名称.resize()
重新指定大小
数组名称.size()
返回数组的大小
例题:询问学号(洛谷 P3156)
#include<vector>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,tmp;
vector<int>stu;//定义
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>tmp;
stu.push_back(tmp);//在尾部插入值
}
for(int i=1;i<=m;i++){
cin>>tmp;
cout<<stu[tmp-1]<<endl;
}
return 0;
}
总结
-
如果你是初学者:vector向量相当于一个数组,访问(比静态数组)更方便一点,更省空间。
-
如果你是半资深OIer:本文总结了大部分常用的函数和迭代器,可以满足普及+/提高及以内难度的大部分题目。
-
如果你是资深OIer:感谢阅读完本文,如有笔误,望可以私信我指正,必壶关。
-
如果你是来逛逛的:希望可以点个小赞鼓励我,谢谢啦OvO