【STL容器学习】-迭代器
STL中的容器类广泛使用迭代器,迭代器是一种对象,使用它可方便地对容器中的元素进行遍历。迭代器与内置指针很相似,都提供了一种访问和操纵容器中元素的方便途径。迭代器可以分为以下5个类型:输入迭代器:用于从容器中读取元素,每一步只能沿向前的方向移动一个元素。输出迭代器:用于向容器中写入元素,每一步只能沿向前的方向移动一个元素。向前迭代器:包含输入输出迭代器的所有功能,既支持读操作又支持写操
·
STL中的容器类广泛使用迭代器,迭代器是一种对象,使用它可方便地对容器中的元素进行遍历。迭代器与内置指针很相似,都提供了一种访问和操纵容器中元素的方便途径。迭代器可以分为以下5个类型:
输入迭代器:用于从容器中读取元素,每一步只能沿向前的方向移动一个元素。
输出迭代器:用于向容器中写入元素,每一步只能沿向前的方向移动一个元素。
向前迭代器:包含输入输出迭代器的所有功能,既支持读操作又支持写操作。
双向迭代器:包含向前迭代器的所有操作,还有向后移动的能力。每一步可以自由选择向前还是向后移动。
随机访问迭代器:包含双向迭代器的所有功能,具有按任意顺序访问任意元素的能力,即能向前或向后跳过任意多个位置。
其中,vector和deque支持随机访问迭代器,list、set、multiset、map和multimap支持双向迭代器,stack、queue和priority_queue不支持迭代器。
迭代器支持的运算符有以下这些:
1)所有迭代器
++p: 迭代器先进
p++: 迭代器后进
2)输入迭代器
*p: 解引用一个迭代器,作为右值使用
p1 == p2: 若p1和p2指向同一个元素,结果为真
p1 != p2: 若p1和p2指向不同的元素,则结果为真
3)输出迭代器
*p: 解引用一个迭代器,作为左值使用
4)双向迭代器
--p: 迭代器先退
p--: 迭代器后退
5)随机访问迭代器
p+=i: 迭代器向前移动i个位置
p-=i: 迭代器向后移动i个位置
p+i: 返回p后面第i个位置的迭代器
p-i: 返回p之前第i个位置的迭代器
p1<p2: 若p1在p2之前,返回真
p1<=p2: 若p1在p2之前,或相等,返回真
p1>p2: 若p1在p2之后,返回真
p1>=p2: 若p1在p2之后,或相等,返回真
p[i]: 返回距p偏移为i的元素
10 20 30 40 50 60
60
30
30
输入迭代器:用于从容器中读取元素,每一步只能沿向前的方向移动一个元素。
输出迭代器:用于向容器中写入元素,每一步只能沿向前的方向移动一个元素。
向前迭代器:包含输入输出迭代器的所有功能,既支持读操作又支持写操作。
双向迭代器:包含向前迭代器的所有操作,还有向后移动的能力。每一步可以自由选择向前还是向后移动。
随机访问迭代器:包含双向迭代器的所有功能,具有按任意顺序访问任意元素的能力,即能向前或向后跳过任意多个位置。
其中,vector和deque支持随机访问迭代器,list、set、multiset、map和multimap支持双向迭代器,stack、queue和priority_queue不支持迭代器。
迭代器支持的运算符有以下这些:
1)所有迭代器
++p: 迭代器先进
p++: 迭代器后进
2)输入迭代器
*p: 解引用一个迭代器,作为右值使用
p1 == p2: 若p1和p2指向同一个元素,结果为真
p1 != p2: 若p1和p2指向不同的元素,则结果为真
3)输出迭代器
*p: 解引用一个迭代器,作为左值使用
4)双向迭代器
--p: 迭代器先退
p--: 迭代器后退
5)随机访问迭代器
p+=i: 迭代器向前移动i个位置
p-=i: 迭代器向后移动i个位置
p+i: 返回p后面第i个位置的迭代器
p-i: 返回p之前第i个位置的迭代器
p1<p2: 若p1在p2之前,返回真
p1<=p2: 若p1在p2之前,或相等,返回真
p1>p2: 若p1在p2之后,返回真
p1>=p2: 若p1在p2之后,或相等,返回真
p[i]: 返回距p偏移为i的元素
以下为vector使用迭代器的一个小例子:
#include <iostream>
#include <vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
vec.push_back(40);
vec.push_back(50);
vec.push_back(60);
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<"\t";
}
cout<<endl<<*(--it)<<endl;
cout<<*(it-3)<<endl;
cout<<it[-3]<<endl;
*it=1234;
for(it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<"\t";
}
return 0;
}
执行后的结果为:
10 20 30 40 50 60
60
30
30
10 20 30 40 50 1234
下面重点介绍以下迭代器失效的问题。
1)vector迭代器失效情况:
当插入一个元素后,end操作返回的迭代器肯定失效。
当插入一个元素后,如果容器中元素的个数超过了vector的容量,则vector会自动重新分配原来容量的两倍内存,并把原来的元素都拷贝 到新的vector中,因此,这种情况下,所有的迭代器都会失效。
当进行删除操作时,指向该删除点的迭代器以及删除点后面的迭代器全部都会失效。
2)deque迭代器失效情况:
在deque容器首部或者尾部插入元素不会使得任何迭代器失效。
在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。
在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。
3)list、set和map迭代器失效情况:
只是在删除时,会导致删除点的迭代器失效。
更多推荐
已为社区贡献3条内容
所有评论(0)