C++中的迭代器到底是什么?
What exactly is an iterator in 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) 在两种情况下都保持不变的原因(因为我们正在获取迭代器对象的地址)。
我不确定我是否理解正确,所以请告诉我我是否正确,如果我错了请纠正我。
What exactly is an iterator in C++?
迭代器是一个概念。该概念描述了具有特定属性和具有特定行为的操作的类型。符合“迭代器”概念的类型称为迭代器,类似这种类型的对象也是迭代器。
更具体地说,迭代器是指针的泛化。它一般指向一个实体(通常是一个对象),你可以通过迭代器间接访问指向的对象(使用一元运算符*
,称为间接运算符)并且有一种方法可以修改迭代器指向“下一个”实体(使用运算符 ++
)。
we can conceptualize an iterator as a box that holds values
“持有”可能会产生误导。引用的实体不一定也不通常存储在迭代器中。它通常存储在别处并且迭代器“知道”实体在哪里。
与其说是“盒子”,不如说它是一个带有如何找到该实体的说明的标志。作为视觉隐喻,它“指向”实体。
The actual box doesn't change, and that's why (&it) stays the same in both cases
明确地说,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, 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;
我正在努力掌握迭代器的概念。我已经 运行 通过以下代码进行了一些测试:
#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) 在两种情况下都保持不变的原因(因为我们正在获取迭代器对象的地址)。
我不确定我是否理解正确,所以请告诉我我是否正确,如果我错了请纠正我。
What exactly is an iterator in C++?
迭代器是一个概念。该概念描述了具有特定属性和具有特定行为的操作的类型。符合“迭代器”概念的类型称为迭代器,类似这种类型的对象也是迭代器。
更具体地说,迭代器是指针的泛化。它一般指向一个实体(通常是一个对象),你可以通过迭代器间接访问指向的对象(使用一元运算符*
,称为间接运算符)并且有一种方法可以修改迭代器指向“下一个”实体(使用运算符 ++
)。
we can conceptualize an iterator as a box that holds values
“持有”可能会产生误导。引用的实体不一定也不通常存储在迭代器中。它通常存储在别处并且迭代器“知道”实体在哪里。
与其说是“盒子”,不如说它是一个带有如何找到该实体的说明的标志。作为视觉隐喻,它“指向”实体。
The actual box doesn't change, and that's why (&it) stays the same in both cases
明确地说,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, 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;