自C++ 11起,基于范围的“ for”循环已包含在该语言中。它会自动迭代(循环)可迭代对象(容器)。当与标准库容器一起使用时(这将在本文中使用),这是非常有效的,因为在可迭代范围之外不会有错误的内存访问。循环将自动在正确的位置开始和结束。
句法 :
for ( range_declaration : range_expression )
loop_statement
- 有三种不同类型的基于范围的“ for”循环迭代器,分别是:
- 普通迭代器:
在普通迭代器中,将普通的临时变量声明为迭代器,并且迭代器通过value获得当前循环项的副本。对临时副本所做的任何更改都不会反映在原始Iterable中。句法 :
for (datatype iterator : list) { // operation are performed here }
- 所使用的迭代器是像整数,浮点,双精度等的任何数据类型,其被用于迭代任何类型的容器的正常迭代器。
- list可以是任何类型的容器。
这是基于普通范围的迭代器的实现:
// C++ program to implements // normal iterators #include
#include using namespace std; // Function to implements // normal iterators void normal_iterator(vector my_iterable) { // Printing the iterable before making // any changes cout << "Value before modification: "; for (int my_iterator : my_iterable) { cout << my_iterator << " "; } // Case where the iterator // makes a temporary copy // of the current loop item for (int my_iterator : my_iterable) { // changing the value of the iterator my_iterator += 1; } cout << "\nValue after modification : "; // Printing the iterable // to see if any changes // has been made in the // original container or not for (int my_iterator : my_iterable) { cout << my_iterator << " "; } } // Driver Code int main() { // Initialising a standard // template container vector 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
- 参考迭代器:
引用迭代器被声明为引用变量,并且迭代器通过reference获得当前项的值。因此,在循环内部所做的更改肯定会在原始容器本身中受到影响。句法 :
for (datatype & iterator : list) { // operation are performed here }
- 所使用的迭代器是像整数,浮点,双精度等的任何数据类型,其被用于迭代任何类型的容器的正常迭代器。
- list可以是任何类型的容器。
这是基于普通范围的迭代器的实现:
// C++ program to implements // reference iterators #include
#include using namespace std; // Function to implements // reference iterators void reference_iterator(vector my_iterable) { // Printing the iterable before // making any changes cout << "Value before modification: "; for (int my_iterator : my_iterable) { cout << my_iterator << " "; } // Iterating the container // using reference iterator // and updating the value for (int& my_iterator : my_iterable) { my_iterator += 1; } cout << "\nValue after modification : "; for (int my_iterator : my_iterable) { cout << my_iterator << " "; } } // Driver Code int main() { // Initialising a standard // template container vector 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; } 输出:Value before modification: 101 102 103 104 Value after modification : 102 103 104 105
- 常量迭代器:
常量迭代器被声明为对常量的引用,在这种情况下,与上述两种情况相比,将不复制当前循环项,从而使执行速度更快。在我们不希望迭代器值有任何意外更改的情况下,或者在容器中对大型项目进行迭代时,这很有用。如果我们尝试修改现有值,则编译器将显示错误。句法 :
for (const datatype iterator : list) { // operation are performed here }
- 所使用的迭代器是像整数,浮点,双精度等的任何数据类型,其被用于迭代任何类型的容器的正常迭代器。
- list可以是任何类型的容器。
这是基于普通范围的迭代器的实现:
// C++ program to implements // constant iterators #include
#include using namespace std; // Function to implements // constant iterators void reference_iterator(vector my_iterable) { // Printing the iterable // using constant iterator for (const int& my_iterator : my_iterable) { cout << my_iterator << " "; // Uncomment below line to see the error // my_iterator += 1 ; } } // Driver Code int main() { // Initialising a standard // template container vector 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
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。