C++ STL 向量vector

本文主要简述向量(vector)的原理和实现,便于快速学习和查阅。

1. vector的定义

如果要使用vector,需要添加头文件

#include 
  • 一维数组声明

单独声明一个vector

vector<typename> name;

上面的这个声明其实相当于一维数组,只不过长度可以根据需要进行变化。typename可以是任何基本类型,例如intdouble、结构体等;也可以是STL标准容器,例如vectorset等。

如果typename也是一个STL容器,定义的时候要记得在> >符号之间加上空格,避免编译器将其视为移位操作。

下面是一些简单的例子:

vector<int> name;
vector<double> name;
vector<vector<int> > name;  // > >之间要加空格
  • 二维数组声明

vector数组声明:

vector<typename> Arrayname[arraySize];

这种定义与vector > name 不同的是,这种写法的一维长度已经固定为arraySize,另一维才是变长的。

要体会这种方式与vector > name两种写法的区别。

2. vector容器内元素的访问

vector一般有两种访问方式:通过下标访问和通过迭代器访问。

  • 通过下标访问

和访问普通数组是一样的直接访问vi[index]

  • 通过迭代器访问

迭代器可以理解为一种类似指针的东西。

vector<typename>::iterator it;

例如:

vector<int>::iterator it;

这样就得到了迭代器it,可以通过*it操作来访问vector内的元素。例如vector中已有5个元素。

vector<int>::iterator it = vi.begin();  // vi.begin()为取vi的首元素地址
for (int i = 0; i < 5; i++)
{
	printf("%d ", *(it + i));
}

从这里看出vi[i]*(vi.begin() + i)是等价的。

3. 向量的使用

  • 元素遍历

迭代器还有it++++it两种自增操作,同理也有自减操作。那么遍历写法如下:

for(vector<int>::iterator it = vi.begin(); it != vi.end(); it++)
{
	printf("%d ", *it);
}

注意:end()并不是取vi的尾元素地址,而是取尾元素地址的下一个地址。

  • 添加元素

在vector后面添加一个元素x。

vi.push_back(x);
  • 删除尾元素

删除vector尾元素。

vi.pop_back();
  • 获取元素个数

获得vector中元素的个数,返回的是unsigned类型。

vi.size();
  • 清空元素

清空vector中所有的元素。

vi.clear();
  • 插入元素

向vector的任意迭代器it处插入一个元素x。

vi.insert(it, x);
  • 删除元素

删除元素有两种:删除单个元素和删除一个区间内的所有元素。

删除迭代器为it处的元素。

erase(it);

删除[first, last)内所有的元素。

erase(first, last);

你可能感兴趣的:(STL)