提供了对对象的间接访问。
所有标准库容器都可以使用迭代器(eg, string, vector)。
迭代器的类型
1. iterator: 读写。
2. const_iterator: 只读。
注:如果使用迭代器的容器对象是常量(const),那么只能使用const_interator。
无法确定返回值类型,通常使用auto接收。
迭代器的基础使用
1. begin运算符和end运算符
返回的迭代器类型由使用的容器对象决定,如果对象是常量,则返回const_iterator;
如果不是,则返回iterator。
2. cbegin运算符和cend运算符
返回值const_iterator.
#include <vector>
using std::vector;
int main(){
vector<int> vec = {1, 2, 3, 4};
auto it1 = vec.begin();
auto it2 = vec.end();
auto it3 = vec.cbegin();
auto it4 = vec.cend();
}
迭代器运算符
1. 返回迭代器所指元素的引用
2. 解引用迭代器
3. 移动到下一元素
4. 移动到上一元素
5. 判断迭代器是否相等
#include <vector>
using std::vector
int main(){
vector<int> vec = {1, 2, 3};
auto it = vec.begin();
auto it2 = ++it;
//1.迭代器的引用
*it;
//2.解引用it,并且获取it所指元素的成员men,等价于(*it).mem
it->mem;
//3.移动到下一元素
++it;
//4.移动到上一元素
--it;
//5.判断两个迭代器是否相等,当且仅当他们指向同一元素,或,指向同一容器的尾后元素
it == it2;
it != it2;
}
练习题
1. 假设用一个名为text的字符串向量存放文本文件中的数据,其中元素或者是一句话或者是一个用于表示段落分隔的空字符串。输出text中的第一段并全都改成大写形式。
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using std::vector;
using std::string;
using std::cin;
using std::cout;
using std::endl;
int main() {
//声明并初始化text
vector<string> text = {"HelloWord", "HappyNewYear","Next","","End"};
/*
*外层循环遍历text,直到遇到空字符
*内层循环遍历元素string字符串,将每个字符转换为大写
*/
for(auto it = text.begin(); it != text.end() && !it->empty(); ++it){
for(auto c = (*it).begin(); c != (*it).end(); ++c){
*c = toupper(*c);
}
cout << *it << endl;
}
}
2. 编写一段程序,创建一个含有10个整数的vector对象,然后使用迭代器将所有元素的值都变成原来的两倍。输出vector对象的内容,检验程序是否正确。
int main() {
vector<int> number(10,6);
for(auto it = number.begin(); it != number.end(); ++it){
*it = *it * 2;
cout << *it << endl;
}
}