迭代器是一种检查容器内元素并且遍历容器内元素的数据类型。它提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。
一、vector容器的iterator类型
vector容器的迭代器属于随机访问迭代器,一次可以移动多个位置。
vector<int>::iterator iter;//变量名为iter
成员函数 | 功能 |
begin() | 返回指向容器中第一个元素的正向迭代器,若是const类型容器,在该函数返回的是常量正向迭代器。 |
end() | 返回指向容器最后一个元素之后一个位置的正向迭代器;如果是const类型容器,在该函数返回的是常量正向迭代器。此函数通常和begin()搭配使用。 |
rbegin() | 返回指向最后一个元素的反向迭代器;如果是const类型,在该函数返回的是常量反向迭代器。 |
rend | 返回指向容器第一个元素之后一个位置的反向迭代器;如果是const类型容器,在该函数返回的是常量正向迭代器。此函数通常和rbegin()搭配使用。 |
cbegin() | 和begin()功能类似,其返回的迭代器类型为常量正向迭代器,不能修改元素。 |
cend | 和end()功能类似,其返回的迭代器类型为常量正向迭代器,不能修改元素。 |
crbegin() | 和rbegin()功能类似,其返回的迭代器类型为常量反向迭代器,不能修改元素。。 |
crend | 和rend()功能类似,其返回的迭代器类型为常量反向迭代器,不能修改元素 |
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int arr[]={0,1,2,3,4};
vector<int> vecInt;
vecInt.assign(arr,arr+5);
vector<int>::iterator t;
vector<int>::reverse_iterator t1;
//1、
t=vecInt.begin();
for(;t<vecInt.end();t++)
{
cout<<*t<<" ";
}
cout<<endl;
// 输出:0,1,2,3,4
//2、
t=vecInt.end();
t--;
for(;t>=vecInt.begin();t--)
{
cout<<*t<<" ";
}
cout<<endl;
// 输出:4,3,2,1,0
//3、
t1=vecInt.rbegin();
for(;t1<vecInt.rend();t1++)
{
cout<<*t1<<" ";
}
cout<<endl;
// 输出:4,3,2,1,0
//4、
t1=vecInt.rend();
t1--;
for(;t1>=vecInt.rbegin();t1--)
{
cout<<*t1<<" ";
}
cout<<endl;
// 输出:0, 1, 2, 3, 4
return 0;
}
二、迭代器失效
插入元素后导致失效
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vecInt1;
vecInt1.push_back(0);
vecInt1.push_back(1);
vecInt1.push_back(2);
vecInt1.push_back(3);
vecInt1.push_back(4);
vector<int>::iterator t;
t=vecInt1.begin()+2;
vecInt1.insert(t,5);
cout<<*t<<endl;
// 本来应该指向2,插入后指向5
return 0;
}
序列使容器删除元素失效
错误示范:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vecInt1;
vecInt1.push_back(0);
vecInt1.push_back(1);
vecInt1.push_back(1);
vecInt1.push_back(1);
vecInt1.push_back(4);
vector<int>::iterator t;
t=vecInt1.begin();
for(;t<vecInt1.end();t++)
{
if(*t==1)
{
vecInt1.erase(t);
}
}
t=vecInt1.begin();
for(;t<vecInt1.end();t++)
{
cout<<*t<<" ";
}
cout<<endl;
// 输出为0,1,4,没有删除干净1
return 0;
}
由于删除后下一个元素会移到被删除的元素,如果此时指针仍自加1,导致该元素被忽略
解决办法:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vecInt1;
vecInt1.push_back(0);
vecInt1.push_back(1);
vecInt1.push_back(1);
vecInt1.push_back(1);
vecInt1.push_back(4);
vector<int>::iterator t;
t=vecInt1.begin();
for(;t<vecInt1.end();)
{
if(*t==1)
{
vecInt1.erase(t);
}
else
{
t++;
}
}
t=vecInt1.begin();
for(;t<vecInt1.end();t++)
{
cout<<*t<<" ";
}
cout<<endl;
// 输出为0,4
return 0;
}