微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 中的迭代器究竟是什么?

如何解决C++ 中的迭代器究竟是什么?

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

#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) 在两种情况下都保持不变(因为我们正在获取迭代器对象的地址)。

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

解决方法

C++ 中的迭代器究竟是什么?

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

更具体地说,迭代器是指针的泛化。它一般指向一个实体(通常是一个对象),您可以通过迭代器间接访问指向的对象(使用一元运算符<div id="container"> <div id="i1"></div> <div id="i2"></div> <div id="i3"></div> <div id="i4"></div> </div>,称为间接运算符)并且有一种方法可以修改迭代器指向“下一个”实体(使用运算符 *)。

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

“保留”可能会产生误导。引用的实体不一定也不通常存储在迭代器中。它通常存储在其他地方,迭代器“知道”实体在哪里。

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

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

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

,

是的,你说得对。迭代器指向映射中元素的当前内存位置。因此,当您执行 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,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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。