成员函数 | 功能 |
---|---|
begin() | 返回指向容器中第一个元素的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。 |
end() | 返回指向容器最后一个元素之后一个位置的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。此函数通常和 begin() 搭配使用。 |
rbegin() | 返回指向最后一个元素的反向迭代器;如果是 const 类型容器,在该函数返回的是常量反向迭代器。 |
rend() | 返回指向第一个元素之前一个位置的反向迭代器。如果是 const 类型容器,在该函数返回的是常量反向迭代器。此函数通常和 rbegin() 搭配使用。 |
cbegin() | 和 begin() 功能类似,只不过其返回的迭代器类型为常量正向迭代器,不能用于修改元素。 |
cend() | 和 end() 功能相同,只不过其返回的迭代器类型为常量正向迭代器,不能用于修改元素。 |
crbegin() | 和 rbegin() 功能相同,只不过其返回的迭代器类型为常量反向迭代器,不能用于修改元素。 |
crend() | 和 rend() 功能相同,只不过其返回的迭代器类型为常量反向迭代器,不能用于修改元素。 |
图 2 迭代器的具体功能示意图
#include <iostream> //需要引入 vector 头文件 #include <vector> using namespace std; int main() { vector<int>values{1,2,3,4,5}; auto first = values.begin(); auto end = values.end(); while (first != end) { cout << *first << " "; ++first; } return 0; }输出结果为:
1 2 3 4 5
可以看到,迭代器对象是由 vector 对象的成员函数 begin() 和 end() 返回的。我们可以像使用普通指针那样上使用它们。比如代码中,在保存了元素值后,使用前缀++
运算符对 first 进行自增,当 first 等于 end 时,所有的元素都被设完值,循环结束。auto first = std::begin(values); auto end = std::end (values);
#include <iostream> //需要引入 vector 头文件 #include <vector> using namespace std; int main() { vector<int>values{1,2,3,4,5}; auto first = values.cbegin(); auto end = values.cend(); while (first != end) { //*first = 10;不能修改元素 cout << *first << " "; ++first; } return 0; }程序第 12 行,由于 first 是 const 类型的迭代器,因此不能用于修改容器中元素的值。
#include <iostream> //需要引入 vector 头文件 #include <vector> using namespace std; int main() { vector<int>values{1,2,3,4,5}; auto first = values.rbegin(); auto end = values.rend(); while (first != end) { cout << *first << " "; ++first; } return 0; }运行结果为:
5 4 3 2 1
可以看到,从最后一个元素开始循环,遍历输出了容器中的所有元素。结束迭代器指向第一个元素之前的位置,所以当 first 指向第一个元素并 +1 后,循环就结朿了。for (auto first = values.rbegin(); first != values.rend(); ++first) { cout << *first << " "; }
#include <iostream> #include <vector> using namespace std; int main() { vector<int>values; int val = 1; for (auto first = values.begin(); first < values.end(); ++first, val++) { *first = val; //初始化的同时输出值 cout << *first; } return 0; }运行程序可以看到,什么也没有输出。这是因为,对于空的 vector 容器来说,begin() 和 end() 成员函数返回的迭代器是相等的,即它们指向的是同一个位置。
#include <iostream> #include <vector> using namespace std; int main() { vector<int>values{1,2,3}; cout << "values 容器首个元素的地址:" << values.data() << endl; auto first = values.begin(); auto end = values.end(); //增加 values 的容量 values.reserve(20); cout << "values 容器首个元素的地址:" << values.data() << endl; while (first != end) { cout << *first; ++first; } return 0; }运行程序,显示如下信息并崩溃:
values 容器首个元素的地址:0096DFE8
values 容器首个元素的地址:00965560
#include <iostream> #include <vector> using namespace std; int main() { vector<int>values{1,2,3}; cout << "values 容器首个元素的地址:" << values.data() << endl; auto first = values.begin(); auto end = values.end(); //增加 values 的容量 values.reserve(20); cout << "values 容器首个元素的地址:" << values.data() << endl; first = values.begin(); end = values.end(); while (first != end) { cout << *first ; ++first; } return 0; }运行结果为:
values 容器首个元素的地址:0164DBE8
values 容器首个元素的地址:01645560
123
本文链接:http://task.lmcjl.com/news/13844.html