【vector 详解】

------ 用法概括

· 实质:vector 数组相对于普通的数组具有 动态的空间,其内部动态空间的实现基于 倍增思想。不支持任意位置 O(1) 插入

vector<int> a; //定义:长度动态变化的 int 数组 
vector<int> b[500]; //定义:第一维长 500,第二维长度动态变化的 int 数组 
struct node{ int Try; };
vector<node> c; // 自定义结构体也可以保存到 vector 中

------ 指令讲解

size/empty

  • a.size():返回 vector a 数组的实际长度(包含的元素个数)
  • a.empty():返回 bool类型,vector a 数组为空即为 1,反之为 0

clear

  • a.clear():把 vector a 数组清空

迭代器

  • 迭代器:如同 STL容器 的“指针”,定义方式如下:

容器类名 :: iterator 迭代器名;
例:vector < int > :: iterator it;

· 用法:通过迭代器可以读取它指向的元素地址,*迭代器名 就表示迭代器指向的元素值

    for(int i=0; i<5; i++)
        a.push_back(i);
    vector<int>::iterator it;
    for(it=a.begin(); it!=a.end(); it++) { //遍历 vector数组a  
        printf("%d ",*it); 
        *it*=2; //使得 vector数组a 所有元素值变为 2倍 
    } 
    puts("");
    for(it=a.end()-1; it>=a.begin(); it--) 
	    printf("%d ",*it);

输出结果:
0 1 2 3 4
8 6 4 2 0

begin/end

  • a.begin():返回指向 vector a 数组中第一个元素的迭代器,若 a 是一个非空的 vector
    ,则 *a.begin() 与 a[0] 的作用相同
  • a.end():所有的容器都可以视为 “前闭后开” 的结构,end 函数返回 vector a 数组的尾部的迭代器,即第 n 个元素迭代器再往后的 “边界”,*a.end() 属于越界访问,其中 n=a.size()
  • :下面两份代码均遍历 vector a 数组,并输出其所有元素
    for(int i=0; i<a.size(); i++)
        printf("%d ",a[i]); 
    for(it=a.begin(); it!=a.end(); it++)  
    	printf("%d ",*it);

front/back

  • a.front():返回 vector 的第一个元素,等价于 *a.begin() 和 a[0]
  • a.back():返回 vector 的最后一个元素,等价于 *(a.end()-1) 和 a[a.size()-1]

push_back/pop_back

  • a.push_back(x):把元素 x 插入 vector 数组 a 的尾部
  • a.pop_back():删除 vector 数组 a 的最后一个元素

------ 实例

用 vector 代替邻接表存储图

const int N=1e5+10;
int n,m; // n 为点数,m 为边数 
struct node {
	int to,val; 
};
vector<node> a[N]; 
void add(int u,int v,int w) { //储存从 u到 v权值为 w 的边 
	a[u].push_back((node){v,w});
}
void work() { //遍历图 
	for(int i=1; i<=n; i++) 
	    for(int j=0; j<a[i].size(); j++) 
	    	node ans=a[i][j];
} 
部分 大部分 绝大部分 摘抄于《算法进阶》(一本好书)

你可能感兴趣的:(STL,c++,数据结构)