成员函数 | 功能 |
---|---|
begin() | 返回指向容器中第一个元素的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。 |
end() | 返回指向容器最后一个元素之后一个位置的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。此函数通常和 begin() 搭配使用。 |
rbegin() | 返回指向最后一个元素的反向迭代器;如果是 const 类型容器,在该函数返回的是常量反向迭代器。 |
rend() | 返回指向第一个元素之前一个位置的反向迭代器。如果是 const 类型容器,在该函数返回的是常量反向迭代器。此函数通常和 rbegin() 搭配使用。 |
cbegin() | 和 begin() 功能类似,只不过其返回的迭代器类型为常量正向迭代器,不能用于修改元素。 |
cend() | 和 end() 功能相同,只不过其返回的迭代器类型为常量正向迭代器,不能用于修改元素。 |
crbegin() | 和 rbegin() 功能相同,只不过其返回的迭代器类型为常量反向迭代器,不能用于修改元素。 |
crend() | 和 rend() 功能相同,只不过其返回的迭代器类型为常量反向迭代器,不能用于修改元素。 |
图 2 迭代器的具体功能示意图
#include <iostream> //需要引入 array 头文件 #include <array> using namespace std; int main() { array<int, 5>values; int h = 1; auto first = values.begin(); auto last = values.end(); //初始化 values 容器为{1,2,3,4,5} while (first != last) { *first = h; ++first; h++; } first = values.begin(); while (first != last) { cout << *first << " "; ++first; } return 0; }输出结果为:
1 2 3 4 5
可以看出,迭代器对象是由 array 对象的成员函数 begin() 和 end() 返回的。我们可以像使用普通指针那样上使用迭代器对象。比如代码中,在保存了元素值后,使用前缀 ++ 运算符对 first 进行自增,当 first 等于 end 时,所有的元素都被设完值,循环结束。auto first = std::begin(values); auto last = std::end (values);这样,容器中的一段元素可以由迭代器指定,这让我们有了对它们使用算法的可能。
#include <iostream> //需要引入 array 头文件 #include <array> using namespace std; int main() { array<int, 5>values{1,2,3,4,5}; int h = 1; auto first = values.cbegin(); auto last = values.cend(); //由于 *first 为 const 类型,不能用来修改元素 //*first = 10; //遍历容器并输出容器中所有元素 while (first != last) { //可以使用 const 类型迭代器访问元素 cout << *first << " "; ++first; } return 0; }此程序的第 14 行代码中,我们尝试使用 first 迭代器修改 values 容器中的值,如果取消注释并运行此程序,编译器会提示你“不能给常量赋值”,即 *first 是 const 类型常量,所以这么做是不对的。但 17~22 行代码遍历并访问容器的行为,是允许的。
#include <iostream> //需要引入 array 头文件 #include <array> using namespace std; int main() { array<int, 5>values; int h = 1; auto first = values.rbegin(); auto last = values.rend(); //初始化 values 容器为 {5,4,3,2,1} while (first != last) { *first = h; ++first; h++; } //重新遍历容器,并输入各个元素 first = values.rbegin(); while (first != last) { cout << *first << " "; ++first; } return 0; }运行结果为:
1 2 3 4 5
可以看到,从最后一个元素开始循环,不仅完成了容器的初始化,还遍历输出了容器中的所有元素。结束迭代器指向第一个元素之前的位置,所以当 first 指向第一个元素并 +1 后,循环就结朿了。for (auto first = values.rbegin(); first != values.rend(); ++first) { cout << *first << " "; }
本文链接:http://task.lmcjl.com/news/15833.html