【发布时间】:2020-06-13 22:57:40
【问题描述】:
我无法理解迭代器在 C++ 中是如何工作的。正如我在一些博客中读到的,迭代器不包含地址。如果它不包含地址,那么我们如何准确地增加它,例如 it++ 或 ++it。
让我们举一个向量迭代器的例子。
vector<int> ::iterator it;
for(it=vec.begin(); it!=vec.end(); it++)
{
// do something
}
如果迭代器不是包含地址的指针,那么它++到底在做什么。它在存储什么。它是如何在内部工作的。迭代器如何准确指向向量的元素?
【问题讨论】:
-
你似乎没有代码问题,而是一些关于 C++ 的通用问题。
-
你知道什么是运算符重载吗?
-
"如果迭代器不是包含地址的指针",从技术上讲,指针对于
std::vector来说是非常有效的迭代器(并且可能在大多数 C++ 标准库中使用实现),但它也可以是为此而设计的类。 -
@Yksisarvinen 我不认为任何主要的标准库实现都使用
std::vector迭代器 (godbolt.org/z/t5NhEp) 的指针。 -
@pujadeo 如上所述,一个简单的指针对于
std::vector迭代器也是有效的,但我假设大多数实现都会向迭代器类添加可选的越界检查等。对于其他容器,例如std::list,指针是不够的,因为元素不是连续存储的,因此运算符重载的类例如找到正确的下一个元素是必要的。迭代器概念是指针概念的推广。
标签: c++ c++11 vector stl iterator