迭代器与vector向量容器的用法
迭代器
实际上,能够 遍历 一个 容器 的 工具 都可以称作是 迭代器。
分为正向迭代器和反向迭代器。
使用方法:
正向迭代器
容器类型<变量类型>::iterator 迭代器名;
例如:vector<int>::iterator p;
p 就是储存 int 类型数据的 vector 容器的迭代器。
反向迭代器,定义方法如下:
容器类名::reverse_iterator 迭代器名;
迭代器实质上是指针,也就是指向的数据的地址,因此会有【迭代器地址】的概念。
但是这个迭代器是有储存类型的,因此并不与普通的“指针变量”完全通用,只能说“形式上类似”,“实质上相同”
迭代器的遍历通常是这个样子的:
for (p = v.begin(); p != v.end(); p++) cout << *p << ’ ';
可以看到迭代器指向的元素是与指针类似,可以使用 “++” 自增运算符。迭代器可以使用 p++/p–,也可以使用++p/–p,++p的效率更高。
vector向量容器
向量容器的声明需要头文件
#include<vector>
你可以将 vector 容器理解为一个高级的数组,与数组一样能够通过下标来随机存取,但并不需要提前声明容器容量,也有很多便利的 方法 来对容器内部的元素进行操作。
vector<T> v; // T 是容器内元素的变量类型
vector<int> v; //声明一个空的 vector 容器 v ,其内部元素的数据类型是 int
vector<double> v(6); //声明一个储存 double 型数据的 vector 容器,让它具有 6 的初始容量,下标是 0~5 初始值是 0.0
vector<double> v(8, 2.33); //定义一个 v ,容量是 8 ,每个元素的值是2.33
vector容器的常用方法
v.push_back(e); //从容器末端追加一个元素,容器末端自动扩张
v.begin(); //返回向量容器的首地址,也就是第一个元素的迭代器地址
v.end(); //返回向量容器的尾地址,注意尾地址是最后一个元素的下一个位置的迭代器地址
v.insert(v.begin() + n, e); //往指定地址的位置插入一个元素,如例:在 n 号元素**前**插入num
v.erase(v.begin()+n,v.begin()+(n+2)); //删除一个元素,或删除一段元素(n到n+2),p 为迭代器地址
v.size() //返回 v 的大小(元素个数)
v.empty() //如果容器为空,返回“真”,如果不为空,返回“假”
v.clear() //清空容器内容
vector 向量容器的操作和遍历
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
vector<int> v;
//尾部添加元素
v.push_back(2);
v.push_back(4);
v.push_back(6);
vector<int>::iterator iter;//生成相应容器的迭代器
//遍历出容器内的元素
for(iter=v.begin();iter!=v.end();++iter)
cout<<*iter<<" ";
cout<<endl;
cout<<"v.size()="<<v.size()<<endl;//容器内元素的个数
v.clear();//将容器清零
cout<<"v.size()="<<v.size()<<endl;
//循环添加元素
for(int i=1;i<=9;++i)
v.push_back(i);
//在三号元素前添加666
v.insert(v.begin()+3,666);
for(iter=v.begin();iter!=v.end();++iter)
cout<<*iter<<" ";
cout<<endl;
cout<<"v.size()="<<v.size()<<endl;
//删除5号元素
v.erase(v.begin()+5);
for(iter=v.begin();iter!=v.end();++iter)
cout<<*iter<<' ';
cout<<endl;
//删除四号到七号之间的元素(注意它删除时是左闭右开,即会删除四号元素)
/* v.erase(v.begin()+4,v.begin()+7);
for(iter=v.begin();iter!=v.end();++iter)
cout<<*iter<<' ';
cout<<endl;*/
v.erase(v.begin()+5,v.begin()+7);
for(iter=v.begin();iter!=v.end();++iter)
cout<<*iter<<' ';
cout<<endl;
//测试一下empty()
if(v.empty())
cout<<"空"<<endl;
else
cout<<"非空"<<endl;
v.clear();
if(v.empty())
cout<<"空"<<endl;
else
cout<<"非空"<<endl;
}
结果展示:
2 4 6
v.size()=3
v.size()=0
1 2 3 666 4 5 6 7 8 9
v.size()=10
1 2 3 666 4 6 7 8 9
1 2 366 4 8 9
非空
空
有待补充!