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;
}

总结