STL-顺序容器-Vector
STL中容器分为顺序容器和关联容器.
顺序容器元素的插入位置和元素的值无关,主要为:
- vector
- deque
- list
- forward_list
- array
- string
介绍如下:
名称 | 作用 |
---|---|
vector | 一个动态数组,实际存取都能在常数时间里边完成,在尾端增删元素具有较好的性能 |
deque | 双端队列,支持快速随机访问,在头尾位置插入删除很快. |
list | 双向链表,只支持双向顺序访问,但在任何位置增删元素都能再常数时间内完成. |
forwward_list | 单向链表,支持单向顺序访问,在任何位置插入删除元素都在常数时间内完成. |
array | 固定大小数组,支持快速随机访问,不能添加删除元素. |
string | 与vector相似的容器,但专门用于保存字符.随机访问很快.在尾部插入删除都很快. |
再介绍容器之前,我们先介绍一下迭代器.
迭代器本质上是一个广义指针,可以指向容器中的任意元素,还能遍历整个容器.
* 解引用:可以快速的访问他的引用值如*p,p->x
* 赋值:把迭代器赋给另一个迭代器
* 比较:可以将迭代器进行比较
* 遍历:通过迭代器p定义++p和p++操作来实现
如何使用迭代器呢?也很简单,每一种容器在自身中都定义了一种迭代器,如使用vector的迭代器
vector<classname>::iterator VarName;
现在我们言归正传,那么如何使用vector呢,
首先我们必须包含头文件
#include<vector>
vector定义在std命名域中,建议使用全局命名域
using namespace std;
vector自然也是一个模板类,定义一个变量如下:
vector<class> VarName;
vector初始化及析构如下
初始化形式 | 结果 |
---|---|
vector v | 默认初始化 |
vector v(v2) | 拷贝初始化 |
vector v(n) | 创建一个有n个元素的变量,默认值为0 |
vector v(n,elem) | 创建一个有n个元素的变量,默认值为elem |
vector v(beg,end) | 创建变量,并意beg到end指向的内容作为初始值 |
c.~ vector () | 析构变量 |
vector自带的主要成员函数如下:
函数名 | 功能 |
---|---|
at(Post) | 传回第Post个元素的值 |
back() | 传回最后一个数据 |
begin() | 返回指向第一个数据的迭代器 |
clear() | 清除所有的数据 |
empty() | 判断容器是否为空 |
end() | 返回指向末尾的迭代器 |
erase(Post) | 删除Post指向的数据,返回指向下一个数据的迭代器 |
pop_back() | 删除最后一个元素 |
push_back(element) | 插入一个元素到最后 |
size() | 返回vector中元素的个数 |
insert(Post,element) | 在Post的位置插入一个元素 |
insert(Post,n,element) | 在Post的位置插入n个相同的元素 |
insert(Post,beg,end) | 在Post的位置插入从beg到end中的元素(Post,beg,end为迭代器,上同) |
下边是一些范例,希望能帮你理解vector的操作与使用:
vector的定义与遍历
#include <iostream>
#include<vector>
#include<iterator>
using namespace std;
int main()
{
vector<int> V; //定义一个vector实例
for(int i=0;i<10;i++)
V.push_back(i+1); //向末尾添加元素
vector<int>::iterator P; //定义一个迭代器
for(P=V.begin();P<V.end();P++)
cout<<*P<<endl; //解引用输出
for(int i=0;i<V.size();i++)
cout<<V[i]<<endl; //vector也支持下标引用
return 0;
}
输出:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
vector的初始化与插入删除
#include <iostream>
#include<vector>
#include<iterator>
using namespace std;
int main()
{
vector<int> V(3,4);
for(int i=0;i<V.size();i++)
cout<<"The "<<i+1<<" Number: "<<V[i]<<endl;
V.erase(V.begin());
V.erase(V.end()-1); //注意:end()是指向元素的末尾例如此处指向了第3个元素(之前减去了一个)
cout<<"V中有"<<V.size()<<"个元素"<<endl;
V.push_back(5);
V.insert(V.begin(),3);
for(int i=0;i<V.size();i++)
cout<<"The "<<i+1<<" Number: "<<V[i]<<endl;
cout<<"头元素为: "<<V.front()<<endl;
cout<<"尾元素为"<<V.back()<<endl;
vector<int> V2(V);
for(int i=0;i<V2.size();i++)
cout<<"The "<<i+1<<" Number: "<<V2[i]<<endl;
V.clear();
if(V.empty())
cout<<"V is empty"<<endl;
return 0;
}
输出:
The 1 Number: 4
The 2 Number: 4
The 3 Number: 4
V中有1个元素
The 1 Number: 3
The 2 Number: 4
The 3 Number: 5
头元素为: 3
尾元素为5
The 1 Number: 3
The 2 Number: 4
The 3 Number: 5
V is empty
最后样例写的有点凌乱,见谅见谅…