📜  C++中不同类型的基于范围的for循环迭代器

📅  最后修改于: 2021-05-30 02:25:57             🧑  作者: Mango

自C++ 11起,基于范围的“ for”循环已包含在该语言中。它会自动迭代(循环)可迭代对象(容器)。当与标准库容器一起使用时(这将在本文中使用),这是非常有效的,因为在可迭代范围之外不会有错误的内存访问。循环将自动在正确的位置开始和结束。

句法 :

for ( range_declaration : range_expression ) 
    loop_statement
    有三种不同类型的基于范围的“ for”循环迭代器,分别是:
  1. 普通迭代器:
    在普通迭代器中,将普通的临时变量声明为迭代器,并且迭代器通过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
    
  2. 参考迭代器:
    引用迭代器被声明为引用变量,并且迭代器通过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
    
  3. 常量迭代器:
    常量迭代器被声明为对常量的引用,在这种情况下,与上述两种情况相比,将不复制当前循环项,从而使执行速度更快。在我们不希望迭代器值有任何意外更改的情况下,或者在容器中对大型项目进行迭代时,这很有用。如果我们尝试修改现有值,则编译器将显示错误。

    句法 :

    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等的更多准备工作,请参阅“完整面试准备课程”