【问题标题】:What exactly is an iterator in C++? [duplicate]C++ 中的迭代器到底是什么? [复制]
【发布时间】:2021-09-17 07:30:58
【问题描述】:

我试图掌握迭代器的概念。我通过以下代码运行了一些测试:

#include <iostream>
#include<map>
using namespace std;

int main(){
    map<string,string> mp;//create the map
    mp["key"]="value";//create a key/val pair

    map<string,string>::iterator it=mp.begin();//create an iterator named it


    cout<<(&it)<<" "<<(&*it)<<endl;// 0x7ffeeccd6a18 0x7f9dc5c05970
    it++;//moving the current value of the iterator
    cout<<(&it)<<" "<<(&*it);// 0x7ffeeccd6a18 0x7ffeeccd6a70
}

根据我的理解,我们可以将迭代器概念化为一个包含值的盒子——我们正在迭代的可迭代对象的值。当我们执行“it++;”时并移动迭代器的当前值,我们现在正在访问一个不同的元素,这就是 (&*it) 改变的原因。实际的盒子没有改变,这就是为什么 (&it) 在两种情况下都保持不变(因为我们正在获取迭代器对象的地址)。

我不确定我是否理解正确,所以请告诉我我是否正确,如果我错了请纠正我。

【问题讨论】:

  • 迭代器是一个概念。他们可以以不同的方式行事。底层实现就是这样,一个底层实现。但是,我想不出我见过的任何例子,你的例子都站不住脚。
  • “可迭代的值” 不明确。迭代器不包含key 也不包含value。它确实包含迭代器指向的元素的地址。
  • 这能回答你的问题吗? What is an iterator in general?

标签: c++ pointers iterator


【解决方案1】:

C++ 中的迭代器到底是什么?

迭代器是一个概念。该概念描述了具有特定属性的类型和具有特定行为的操作。符合“迭代器”概念的类型称为迭代器,类似地,这种类型的对象也是迭代器。

更具体地说,迭代器是指针的泛化。它一般指向一个实体(通常是一个对象),您可以通过迭代器间接访问被指向的对象(使用一元运算符*,称为间接运算符)并且有一种方法可以将迭代器修改为指向到“下一个”实体(使用运算符++)。

我们可以将迭代器概念化为一个包含值的盒子

“持有”可能具有误导性。被引用的实体不一定也不通常存储在迭代器中。它通常存储在其他地方,迭代器“知道”实体在哪里。

我会把它描述为一个带有如何找到实体的说明的标志,而不是一个“盒子”。作为一种视觉隐喻,它“指向”实体。

实际的盒子没有改变,这就是为什么 (&it) 在两种情况下都保持不变

需要明确的是,it 的值确实发生了变化。但是it还是同一个迭代器对象,所以它的地址是一样的。

【讨论】:

    【解决方案2】:

    是的,你是对的。迭代器指向映射中元素的当前内存位置。因此,当您执行mp.begin() 时,它指向映射中的第一个键值对。当你这样做++时,它开始指向下一个内存位置,即第二个键值对所在的位置。

    迭代器通常用于遍历地图,如下所示:

        map<int, int> gquiz1;
      
        // insert elements in random order
        gquiz1.insert(pair<int, int>(1, 40));
        gquiz1.insert(pair<int, int>(2, 30));
        gquiz1.insert(pair<int, int>(3, 60));
        gquiz1.insert(pair<int, int>(4, 20));
        gquiz1.insert(pair<int, int>(5, 50));
        gquiz1.insert(pair<int, int>(6, 50));
        gquiz1.insert(pair<int, int>(7, 10));
      
        // printing map gquiz1
        map<int, int>::iterator itr;
        cout << "\nThe map gquiz1 is : \n";
        cout << "\tKEY\tELEMENT\n";
        for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) {
            cout << '\t' << itr->first
                 << '\t' << itr->second << '\n';
        }
        cout << endl;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2015-10-20
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多