1,迭代器类型
iter1 - n
每种容器都定义了自己的迭代器类型。所以定义迭代器时,必须指明数据类型。如:
vector<int>::iterator iter;
iter代表的是vector中元素的位置,要想获取元素具体的值,使用解引用操作符。
*iter = 2;
2,begin与end
每种容器都定义了一对名为begin与end的成员函数,用于返回迭代器。
vector<int>::iterator iter = ivec.begin();
begin返回的是容器中的第一个元素;
end不指向真实的元素,其返回的是最后一个元素之后的位置(off-the-end iterator).
因为不指向真实的元素,所以也就不能对其返回的值解引用。
3,自增操作
从当前位置指向下一个位置用自增操作
++iter;
iter++;
4,比较
判断两个迭代器是否相等(是否指向相同的位置)可以使用== 和 !=号来判断。
大于、小于判断亦可。
使用示例:
ivec.push_back(0);
ivec.push_back(1);
ivec.push_back(2);
ivec.push_back(2);
ivec.push_back(2);
ivec.push_back(3);
ivec.push_back(4);
cout << "before: ivec.size " << ivec.size() << endl;
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)
{
cout << *iter << endl;
}
vector<int>::iterator iter2 = ivec.begin() + 2;//改变长度之前的迭代器
cout << "*iter2 = " << *iter2 << endl;
//删除
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); )
{
if (*iter == 2)
{
iter = ivec.erase(iter);//删除后返回下一个位置
}
else
{
iter++;
}
}
cout << "after: ivec.size " << ivec.size() << endl;
5,const_iterator
类似于const引用,const_iterator本身的值可以改变,即可以指向不同的对象,但是不能通过它改变其指向的对象的值。换言之,可以用来获取对象的值,但不能用来改变对象的值。
vector<int>::const_iterator iter;
*iter = 2;//error!!
6,迭代器的算术运算
并不是所有迭代器都支持这些算术运算,但是vector迭代器支持。
(1)加法:iter1 + n
比如 ivec.begin() + 2即为指向第2个元素(从0开始数)
(2)减法:iter1 - iter2
这个减法运算返回difference_type类型,其为signed类型。
vector<int>::difference_type delt;
注意:不能将两个迭代器相加!
7,迭代器失效
在改变vector的长度之后,比如经过push_back()或者erase()操作之后,已经存在的迭代器会失效。
比如下面的代码:
vector<int> ivec(5,1);
vector<int>::iterator iter2 = ivec.begin() + 2;//改变长度之前的迭代器
cout << "before *iter2 = " << *iter2 << endl;
//改变ivec长度
ivec.push_back(2);
//改变长度之后再次输出原迭代器
cout << "after *iter2 = " << *iter2 << endl;
编译通过,但是运行时报错。
错误信息显示该迭代器是不可解引用的。