为什么(必须)继承自 std::iterator?

2024-01-10

据我了解,迭代器是一种为客户端提供接口来观察/迭代/传递自定义集合等内容的机制,而不会破坏信息隐藏原则。 STL容器有自己的迭代器,所以我们可以使用for ( : ) and for_each在它们上循环没有问题。

我最初的问题是:为什么继承自std::iterator?与以下示例相比,它提供了哪些附加功能:

简单数组.h

class SimpleArray
{
    int *arr;
    int n;
public:
    explicit SimpleArray(int = 1);
    ~SimpleArray();

    friend ostream& operator<<(ostream&, const SimpleArray&);
    friend istream& operator>>(istream&, SimpleArray&);

    // encapsulated "iterator"
    class Observer
    {
        int *p;
    public:
        Observer(int *value = nullptr) : p(value) {}
        Observer& operator++() { p++; return *this; }
        Observer operator++(int) { int *temp = p; p++; return Observer(temp); }
        bool operator==(Observer other) const { return p == other.p; }
        bool operator!=(Observer other) const { return p != other.p; }
        int& operator*() const { return *p; }
    };

    Observer begin() { return Observer(arr); }
    Observer end() { return Observer(arr + n - 1); }
};

源码.cpp

int main()
{
    SimpleArray array(5);
    cin >> array;

    for (int item : array)
    {
        cout << item << " ";
    }

    cin.ignore();
    cin.get();
}

Input

1 2 3 4 5

begin() and end()职能是公共的,并且Observer封装了循环运行所需的所有运算符。代码编译完成。

Output

1 2 3 4 5

尝试同样的操作后std::for_each

std::for_each(array.begin(), array.end(), [](int item) { cout << item << " "; });

我遇到了一些编译器错误:

C2062: type 'unknown-type' unexpected   Observer
C2938: '_Iter_cat_t<SimpleArray::Observer>' : Failed to specialize alias template
C2794: 'iterator_category': is not a member of any direct or indirect base class of 'std::iterator_traits<_InIt>'

阅读完有关for_each http://en.cppreference.com/w/cpp/algorithm/for_each,我发现它的类型参数必须满足一些要求,简而言之——是Iterators。

我现在的问题是:如果创建一个函数相当容易,为什么这个函数(以及其他许多函数)以强制执行此标准的方式设计?regular提供迭代功能的类?


唯一的事情std::iterator提供的是成员类型iterator_category, value_type, difference_type, pointer, and reference,它们是根据您提供的模板参数定义的。它没有任何其他成员。您可以自己定义这些成员类型。

真正的答案是你不需要继承std::iterator根本没有,而且它不会给你带来任何真正的优势。对于C++来说,如果它看起来像一个迭代器,那么它就是一个迭代器。您只需要确保您的迭代器类型遵循此处概述的概念:https://en.cppreference.com/w/cpp/named_req/Iterator https://en.cppreference.com/w/cpp/named_req/Iterator

std::iterator在 C++17 中已被弃用,因为它相对无用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么(必须)继承自 std::iterator? 的相关文章

随机推荐