带有迭代器的代码看起来很像带有指针的代码。迭代器是一些晦涩的类型(例如 std::vector<int>::iterator
)。
我没有得到的是迭代器和指针是如何相互关联的——迭代器是指针周围的包装器,具有重载操作以前进到相邻元素还是别的什么?
原文由 sharptooth 发布,翻译遵循 CC BY-SA 4.0 许可协议
带有迭代器的代码看起来很像带有指针的代码。迭代器是一些晦涩的类型(例如 std::vector<int>::iterator
)。
我没有得到的是迭代器和指针是如何相互关联的——迭代器是指针周围的包装器,具有重载操作以前进到相邻元素还是别的什么?
原文由 sharptooth 发布,翻译遵循 CC BY-SA 4.0 许可协议
迭代器是重载某些运算符的对象,因此用法看起来就像是指针。这在给定迭代器类别的能力范围内。随机访问迭代器看起来完全像指针,其他类型的迭代器不提供某些操作(例如 list<X>::iterator
它是双向的,没有运算符 +=
以及许多其他需要随机访问的)。
至于“晦涩的名称”,将普通指针用于迭代器并非完全不可想象:
template <class T>
class MyContainer
{
...
typedef T* iterator;
}
MyContainer<int>::iterator it; //the type is really int*
原文由 UncleBens 发布,翻译遵循 CC BY-SA 2.5 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
迭代器是指针的泛化。
迭代器(取决于变体)必须实现 \* 和 ++
所以指针是一个迭代器。但不一定反过来。
如果你想迭代一个复杂的结构(一棵树,一个图……),迭代器将不仅仅是一个指针,并且不会对 ram 中的某个实际位置进行任何引用。