在C++中,迭代器(iteration)提供了一种更通用的机制来访问string对象的字符或者vector容器的元素。所有的标准库容器,都可以使用迭代器,但是只有少数几种才同时支持下标运算符。
和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。如:这些类型都拥有begin和end成员。
- begin: 负责返回指向第一个元素(或第一个字符的迭代器)。
- end: 负责返回容器(或者string)“尾元素的下一个位置”的迭代器。(尾后迭代器)
1. 迭代器的运算符
*iter // 返回迭代器iter所指元素的引用
iter->mem // 解引用iter并获取该元素名为mem的成员,等价于(*iter).mem
++iter // 令iter指向容器的下一个元素
--iter // 令iter指向器的上一个元素
iter1 == iter2 // 判断两个迭代器是否相等(是否指向同一个元素,或者同一个容器的尾后迭代器)
iter1 != iter2
*iter1 == *iter2 // 判断两个迭代器所指向的元素是否相同
*iter1 != *iter2
- for循环,遍历
for (auto it = s.begin(); it != s.end(); ++it) {
std::cout << *it << std::endl; // 解引用打印对应的元素
}
- 迭代器的类型: 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只能读字符,不能写字符
- begin/end和cbegin/cend运算符
begin和end返回的具体类型由对象是否是常量决定,如果是常量,begin和end返回的const_iterator;如果不是常量,返回iterator
vector<int> v;
const vector<int> cv;
auto it1 = v.begin(); // it1的类型是vector<int>::iterator
auto it2 = cv.begin(); // it2的类型是vector<int>::const_iterator
如果对象只需要读操作,而无需写操作最好使用常量类型,为了便于得到const_iterator类型的返回值,C++11引入了cbegin和cend,用法与begin和end相同,但返回的只能是const_iterator类型。
- 解引用运算符(*)、成员访问操作(.)和箭头运算符(->)
C++定义箭头运算符**(->),将解引用和成员访问操作结合到了一起。即(*iter).mem和iter->mem**表达的意思相同
(*it).empty() // 判断迭代器的成员是否为空。
it -> empty() // 与上面的式子相同
2. 迭代器运算
iter + n // 返回的迭代器是原迭代器向前移动若干个元素。如果超出容器的范围,则返回迭代器的第一个元素的位置,或者尾元素的下一个位置。
iter - b // 返回的迭代器是原迭代器向后移动若干个元素。如果超出容器的范围,则返回迭代器的第一个元素的位置,或者尾元素的下一个位置。
iter += n // 迭代器加法赋值语句,将iter + n 赋值给iter (!!!不能超范围!!!)
iter -= n // 迭代器减法赋值语句,将iter - n 赋值给iter (!!!不能超范围!!!)
iter1 - iter2 // 返回两个迭代器,之间的距离。返回的类型为difference_type,带符号的整数。建议使用auto
>、>= 、<、<=、 ==、 != // 判断两个迭代器的位置。必须是同一个容器的迭代器