一、介绍
标准库容器都可以使用迭代器。
类似于指针类型,迭代器提供了对对象的间接访问。
就迭代器而言,其对象是容器中的元素或者string
对象中的字符。
使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。
迭代器分有效和无效之分,这一点和指针差不多,有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置。其他所有情况都属于无效。
二、使用迭代器
// 由编译器决定b和e的类型
// b表示v的第一个元素, e表示v尾元素的下一个位置
auto b = v.begin(), e = v.end(); // b和e的类型相同
end
成员函数负责返回指向容器(或string
对象)尾元素的下一个位置的迭代器。
end
成员返回的迭代器常被称作尾后迭代器
,或者简称为尾迭代器
。
特殊情况下,如果容器为空,则begin
和end
返回的是同一个迭代器,都是尾后迭代器
。
迭代器运算符
操作 | 说明 |
---|---|
*iter |
返回迭代器iter所指元素的引用 |
iter->mem |
解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem |
++iter |
令iter指向容器中的下一个元素 |
--iter |
令iter指向容器中的上一个元素 |
iter1 == iter2 | 判断两个迭代器是否相等,如果两个迭代器指向的是同一个元素或者它们是同一个容器中容器中的尾后迭代器,则相等;反之,不相等。 |
iter1 != iter2 |
与 == 情况相反 |
关键概念——泛型编程
C++程序员习惯性地使用 !=
而非<
进行判断。
所有标准库容器类型的迭代器类型都定义了==
和!=
,但是它们中的大多数都没有定义<
运算符。
迭代器类型
一般来说,我们也不知道(其实是无须知道)迭代器的精确类型。
实际上,哪些拥有迭代器的标准库类型使用iterator
和const_iterator
来表示迭代器的类型:
vector<int>::iterator it; // it能读写vector<int>的元素
string::iterator it2; // it2能读写string对象中的字符
vector<int>::const_iterator it3;// it3只能读元素,不能写元素
string::const_iterator it4; // it4只能读字符, 不能写字符
const_iterator
和常量指针差不多,能读取但不能修改它所指的元素值。
相反,iterator
的对象可读可写。
如果 vector
对象或string
对象是一个常量,只能使用const_iterator
。
如果vector
对象或string
对象不是常量,那么既能使用iterator
也能使用const_iterator
。
C++11新标准引入两个新函数:cbegin
和cend
返回值类型均是const_iterator
箭头运算符->
:把解引用和成员访问两个操作结合在一起,即it->mem
和(*it).mem
表达的意思相同。
注意:任何使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。