gpt4 book ai didi

c++ - 为什么(必须)从 std::iterator 继承?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:33 31 4
gpt4 key购买 nike

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

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

SimpleArray.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();
}

输入

1 2 3 4 5

begin()end() 函数是公开的,Observer 封装了循环运行所需的所有运算符。代码编译。

输出

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 后,我发现它的类型参数必须满足一些要求,简而言之 - 是迭代器。

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

最佳答案

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

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

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

关于c++ - 为什么(必须)从 std::iterator 继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48445573/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com