vector,向量(变长数组)

头文件:

#include<vector>

1、vector的定义

单独定义一个vector:

vector<typename> name;

上面这个定义相当于是一个一维数组name[SIZE],只不过其长度可以根据需要进行变化。

typename可以是任何基本类型,例如int、double、char、结构体等,也可以是STL标准容器,例如vector、set、queue等。下面是一些简单例子。

vector<int> name;
vector<double> name;
vector<char> name;
vector<node> name;//node是结构体的类型

vector<vector<int> > name;//>>之间要加空格
//两个维都可以变长的二维数组

定义vector数组:

vector<typename> Arrayname[arraySize];

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

这种写法的一维长度已经固定为arraySize,另一维才是变长的。

2、vector容器内元素的访问

(1)通过下标访问

和访问普通的数组是一样的,对一个定义为vector<typename> vi的vector容器来说,直接访问vi[index]即可(如vi[0]、vi[1])。下标从0到vi.size()-1。

(2)通过迭代器访问

迭代器(iterator)可以理解为一种类似指针的东西,其定义是:

vector<typename>::iterator it;

这样it就是一个vector<typename>::iterator型的变量。可以使用*it来访问vector里的元素。

#include <iostream>
#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));
    }
}
//输出结果:1 2 3 4 5

begin()函数的作用为取vi的首元素地址,end()函数取尾元素的下一个地址

除此之外,迭代器还实现了两种自加操作:++it和it++(自减操作同理),于是有了另一种遍历vector中元素的写法。

#include<iostream>
#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);
    }
}
//输出:1 2 3 4 5

3、vector常用函数

(1)push_back()

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

(2)pop_back()

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

(3)size()

size()用来获得vector中元素的个数,时间复杂度为O(1)。size()返回的是unsigned类型。

(4)clear()

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

(5)insert()

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

(6)erase()

erase()有两种用法:删除单个元素、删除一个区间内的所有元素。时间复杂度均为O(N)。

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

int main() {
    vector<int> vi;
    for (int i = 1; i <= 5; i++) {
        vi.push_back(i);//将1、2、3、4、5依次插入vi的末尾
    }
    vi.pop_back();//删除vi的尾元素3
    vi.insert(vi.begin() + 2, -1);//将-1插入vi[2]的位置
    vi.erase(vi.begin() + 3);//删除第四个元素
    vi.erase(vi.begin() + 1, vi.begin() + 3);//删除vi[1],vi[2],vi[3]
    for (int i = 0; i < vi.size(); i++) {//size()函数会给出vi中元素的个数
        printf("%d ", vi[i]);
    }
    vi.clear();
}