Loading

算法笔记--标准模板库STL--Vector

Vector的常见用法详解

Vector 翻译为向量,是长度可根据需要而自动改变的数组

头文件

#include<vector>
using namespace std;

vector定义

单独一个vector:相当于一维数组name[SIZE]

vector<typename> name;

vector<int> name;			// 基本类型
vector<double> name;
vector<char> name;
vector<node> name;			// 结构体类型
vector<vector<int>> name; 	// STL容器, 这种的vector数组是两个维度都可变的

vector数组:一维长度已经固定为arraySize,另一个维度是可变长度的

vector<typename> ArrayName[arraySize];

vector<int> vi[100]; 

这样ArrayName[0] ~ ArrayName[arraySize - 1]中每一个都是一个vector容器

Vector容器内元素的访问

通过下标访问

​ 和访问普通的数组是一样,对一个定义为vector<typename> vi的vector容器来说,直接
访问vi[index]即可(如可vi[0])。当然,这里下标是从0到vi.size()-1,访问这个范围外的元素可能会运行出错。

通过迭代器访问

迭代器iterator相当于类似指针的东西,其定义为:

vector<typename>::iterator it; // it就是一个vector<typename>::iterator型的变量
							   // typename就是定义vector时填写的类型
vector<int>::iterator it;
vector<double>::iterator it;

有了迭代器it,就可以通过*it来访问vector里面的元素

vector<int> vi;
for(int i = 1; i <= 5; i++){			   		 // 循环完毕后vi中元素为1 2 3 4 5 
    vi.push_back(i);		// push_back(i)在vi的末尾添加元素i,即依次添加1 2 3 4 5 
}

通过类似下标和指针数组的方式来访问容器内的元素:

#include<cstdio>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1; i <= 5; i++){
        vi.push_back(i);
    }
    // vi.begin()为取vi的首元素地址,而it指向这个地址
    vector<int>::iterator it = vi.begin();
    for(int i = 0; i < 5; i++)
        printf("%d ", *(it + i)); // 输出vi[i]
    return 0;
}

vi[i]*(vi.begin() + i)是等价的

1️⃣vi.begin()是取vi的首元素地址

2️⃣vi.end()是取vi的尾元素地址的下一个地址

3️⃣迭代器还提供了自加操作和自减操作,如:++itit++

#include<cstdio>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1; i <= 5; i++){
        vi.push_back(i);
    }

    // vector的迭代器不支持it < vi.end()写法,因此循环条件只能用it != vi.end()
    for(vector<int>::iterator it = vi.begin(); it != vi.end(); it++){
        printf("%d ", *it);
    }
    return 0;
}

在常用的STL容器中,只有在vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的写法

vector常用函数

  1. push_back( )

push_back(x) 就是在vector后面添加一个元素x,时间复杂度为O(1)

  1. pop_back( )

pop_back( ) 用以删除vector的尾元素,时间复杂度为O(1)

#include<cstdio>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1; i <= 5; i++){
        vi.push_back(i);
    }

    for(int i = 0; i < vi.size(); i++){
        printf("%d ", vi[i]);
    }

    printf("\n");
    vi.pop_back();

    for(int i = 0; i < vi.size(); i++){
        printf("%d ", vi[i]);
    }
    return 0;
}
1 2 3 4 5
1 2 3 4
  1. size( )

size( ) 用来获取vector中元素的个数,时间复杂度为O(1)

size( ) 返回的是 unsigned 类型,一般来说 %d 不会出现很多问题

#include<cstdio>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1; i <= 5; i++){
        vi.push_back(i);
    }

    printf("%d ", vi.size());

    return 0;
}
  1. clear( )

clear( ) 用来清空vector中的所有元素,时间复杂度为O(N)

#include<cstdio>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1; i <= 5; i++){
        vi.push_back(i);
    }
    printf("%d ", vi.size());
    vi.clear(); // 清空操作
    printf("%d ", vi.size());
    return 0;
}
  1. insert( )

insert(it, x) 用来向vector的任意迭代器it处插入一个元素x,时间复杂度为O(N)

#include<cstdio>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1; i <= 5; i++){
        vi.push_back(i);
    }
    
    vi.insert(vi.begin() + 3, -1); // 插入操作

    for(int i = 0; i < vi.size(); i++)
        printf("%d ", *(vi.begin() + i));
    return 0;
}
  1. erase( )
  • 🅰删除单个元素,时间复杂度为O(N)
  • 🅱删除一个区间内的所有元素,时间复杂度为O(N)

删除单个元素

#include<cstdio>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1; i <= 5; i++){
        vi.push_back(i);
    }

    vi.erase(vi.begin() + 3); // 删除单个元素

    for(int i = 0; i < vi.size(); i++)
        printf("%d ", *(vi.begin() + i));
    return 0;
}

删除一个区间内的所有元素

#include<cstdio>
#include<vector>
using namespace std;

int main(){
    vector<int> vi;
    for(int i = 1; i <= 5; i++){
        vi.push_back(i);
    }

    vi.erase(vi.begin() + 2, vi.begin() + 4); // 删除区间元素

    for(int i = 0; i < vi.size(); i++)
        printf("%d ", *(vi.begin() + i));
    return 0;
}

vector的常见用途

  • 存储数据

  • 用作邻接表存储图

Write by Gqq

posted @ 2020-03-26 18:42  ZHGQCN  阅读(185)  评论(0)    收藏  举报