C++ 中不同类型的基于范围的 for 循环迭代器
基于范围的“for”循环自 C++11 开始就被包含在语言中。它自动迭代(循环)迭代器(容器)。当与标准库容器一起使用时,这非常高效(正如本文所使用的那样),因为不会访问超出迭代器范围的内存。循环将自动从正确的位置开始并结束。
语法 :
for ( range_declaration : range_expression )
loop_statement
这里有三种不同类型的基于范围的“for”循环迭代器,它们是:
1. 普通迭代器:
在普通迭代器中,声明一个普通临时变量作为迭代器,并且迭代器通过值 按值传递 获取当前循环项的副本。对临时副本进行的任何更改都不会反映在原始可迭代对象中。
语法 :
for (datatype iterator : list)
{
// 在此处执行操作
}
- 使用的 迭代器 是一个普通的任何数据类型的迭代器,如 int、float、double 等,它用于迭代任何类型的容器。
- list 可以是任何类型的容器。
这是普通的基于范围的迭代器实现:
// C++ 程序实现
// 普通迭代器
#include <iostream>
#include <vector>
using namespace std;
// 实现普通迭代器的函数
void normal_iterator(vector<int> my_iterable)
{
// 在做出任何更改之前打印可迭代对象
cout << "Value before modification: ";
for (int my_iterator : my_iterable) {
cout << my_iterator << " ";
}
// 迭代器使使用一
// 个当前循环项的临时副本
for (int my_iterator : my_iterable) {
// 改变迭代器的值
my_iterator += 1;
}
cout << "\nValue after modification : ";
// 打印可迭代对象以查看
// 是否在原始容器中进行了任何更改
for (int my_iterator : my_iterable) {
cout << my_iterator << " ";
}
}
// 主函数
int main()
{
// 初始化一个标准模板容器
vector<int> my_iterable;
my_iterable.push_back(101);
my_iterable.push_back(102);
my_iterable.push_back(103);
my_iterable.push_back(104);
normal_iterator(my_iterable);
return 0;
}
输出:
Value before modification: 101 102 103 104
Value after modification : 101 102 103 104
2. 引用迭代器:
引用迭代器被声明为引用变量,并且迭代器按引用获取当前项的值。因此,在循环内进行的更改肯定会影响原始容器本身。
语法 :
for (datatype & iterator : list)
{
// 在此处执行操作
}
- 使用的 迭代器 是一个普通的任何数据类型的迭代器,如 int、float、double 等,它用于迭代任何类型的容器。
- list 可以是任何类型的容器。
这是引用基本范围的迭代器实现:
// C++程序实现
// 引用迭代器
#include<iostream>
#include<vector>
using namespace std;
// 实现引用迭代器的函数
void reference_iterator(vector<int> my_iterable)
{
// 修改之前打印可迭代对象
cout << "修改之前的值: ";
for(int my_iterator : my_iterable)
{
cout << my_iterator << " ";
}
// 使用引用迭代器遍历容器并修改值
for(int& my_iterator : my_iterable)
{
my_iterator += 1;
}
// 修改之后打印可迭代对象
cout << "\n修改之后的值 : ";
for(int my_iterator : my_iterable)
{
cout << my_iterator << " ";
}
}
// 主函数
int main()
{
// 初始化一个标准的模板容器
vector<int> my_iterable;
my_iterable.push_back(101);
my_iterable.push_back(102);
my_iterable.push_back(103);
my_iterable.push_back(104);
reference_iterator(my_iterable);
return 0;
}
输出:
修改之前的值: 101 102 103 104
修改之后的值 : 102 103 104 105
3. 常量迭代器 :
常量迭代器声明为 对常量的引用 ,在这种情况下,不会复制当前循环项,使执行速度比上面两种情况更快。这在我们不希望迭代器值发生任何意外更改或者如果正在遍历容器中的大型项目时非常有用。如果我们尝试修改现有值,则编译器将显示错误。
语法 :
for (const datatype iterator : list)
{
// 在此执行操作
}
- 使用的 迭代器 是任何数据类型的普通迭代器,如int,float,double等,用于在任何类型的容器上进行迭代。
- list 可以是任何类型的容器。
下面是正常的基于范围的迭代器的实现:
// C++程序实现
// 常量迭代器
#include <iostream>
#include <vector>
using namespace std;
// 实现常量迭代器的函数
void reference_iterator(vector<int> my_iterable)
{
// 使用常量迭代器打印可迭代对象
for (const int& my_iterator : my_iterable)
{
cout << my_iterator << " ";
// 取消下面这一行的注释将会导致错误
// my_iterator += 1 ;
}
}
// 主函数
int main()
{
// 初始化一个标准的模板容器
vector<int> my_iterable;
my_iterable.push_back(101);
my_iterable.push_back(102);
my_iterable.push_back(103);
my_iterable.push_back(104);
reference_iterator(my_iterable);
return 0;
}
输出:
101 102 103 104