实现自己的begin()和end()

Implementing own begin() and end()

本文关键字:end 自己的 实现 begin      更新时间:2023-10-16

我有这个模板:

template<typename C,class F>
class filtered_cont{
     C& container;
     F filter;
     class const_iterator{
     //my iterator implementation
     }
     const_iterator begin(){
     //...
     }
}

C表示容器,F表示过滤器。我想问一下如何实现我自己的begin()方法,它将返回第一个有效元素。我有这样的东西,但我得到错误

const_iterator begin() const{
    for (const_iterator it=cont.begin(); it!=const_iterator(); it++) {
        if(pred(*it)) return it;
    }
    return const_iterator();
}

我认为it=cont.begin()是错误的部分,但我真的不知道如何获得begin()迭代器。

错误:

no viable conversion from 'iterator' (aka '__list_iterator<value_type, __void_pointer>') to 'filter_view<std::__1::list<unsigned char,
      std::__1::allocator<unsigned char> >, is_even>::const_iterator

您将需要使用容器的迭代器,而不是您自己的。类似这样的东西:

const_iterator begin() const{
    for (typename C::const_iterator it=cont.begin(); it!=cont.end(); it++) {
        if(pred(*it)) return const_iterator(it);
    }
    return const_iterator();
}

错误消息说明缺少什么:您的const_iterator需要来自typename Container::const_iterator:的[隐式]构造函数

template <typename C, typename F>
class filtered_cont<C, F>::const_iterator {
public:
    const_iterator(typename C::const_iterator it);
    // ...
};

如果您稍微更改初始化,您可以进行explicit转换,这可能是一个好主意:

for (const_iterator it(cont.begin()); ... ) {
    ...
}

就我个人而言,我希望使用迭代器包含的过滤逻辑,因为它无论如何都需要这个逻辑,例如,当移动到下一个元素时。逻辑本身可能应该是

std::find_if(it, cont.end(), filter);

您的begin函数看起来不错(在pri中)。

您可能希望定义迭代器类型,然后将const_iterator类型定义为它的const版本,而不是定义const_iteror类型

但是,不管怎样,您的类都需要提供一种从任意输入迭代器到所需类型迭代器的方法。这意味着您需要构造函数和通用方法。我不确定应该如何做到这一点,但我猜您自己的迭代器会存储传入迭代器(在C::迭代器字段中),然后将任何调用传递给它。