首页 > 解决方案 > 一般来说,什么是迭代器?

问题描述

当我尝试使用接受“通用迭代器”的 ctor 编写 C++ 类模板时,就会出现这个问题。我不知道这里用general这个词是否合适,但我的意思是它可以像STL容器一样接受迭代器。

换句话说,我对iterator感到困惑。似乎所有 STL 容器都有相同的类型迭代器,那么那个类型是什么?它只是指针吗?或者更复杂的东西?但 STL 容器确实接受普通指针。

(我想将它与Iterator<T>in进行比较Java,这很简单,它只是一个类)

标签: c++iterator

解决方案


在 C++ 中,Iterator是一个概念,不是具体(或抽象)类型,而是任何遵循某些类似迭代器规则的类型。

例如,迭代器通常可以递增++i。可以访问(取消引用)*i它们以获取它们当前指向的值。它们本质上是指针的抽象。

在标准库的容器和算法中,有不同类型的具有不同属性的迭代器。它们的属性在这里列出:

https://en.cppreference.com/w/cpp/iterator

因此,在用 C++ 编写接受迭代器的算法时,通常只接受泛型模板参数并在函数中使用适当的迭代器属性。如果用户向您的函数传递了不遵守迭代器规则的内容,编译器会报错:

template<typename Iterator>
void my_algorithm(Iterator begin, Iterator end)
{
    for(; begin != end; ++begin)
        std::cout << *begin << '\n';
}

你可以添加一大堆特定的检查来确保用户通过了一些合理的东西,但这对于这个问题来说太宽泛了。

笔记:

虽然目前的概念,如Iterator,只是程序员必须遵循的标准中一组商定的语义属性,但将形式化这些概念(在代码中)的更全面的解决方案旨在用于标准的下一个版本,C+ +20


推荐阅读