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

时间:2013-11-24 00:58:56

标签: c++ templates containers

我有这个模板:

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

3 个答案:

答案 0 :(得分:2)

您需要使用容器的迭代器,而不是您自己的迭代器。像这样:

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

答案 1 :(得分:0)

错误消息说明缺少的内容: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);

答案 2 :(得分:0)

你的开始功能看起来很好(在pri中)。

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

但是,无论如何,你的类需要提供一种从任意输入迭代器到所需类型的迭代器的方法。这意味着你需要构造函数和一般方法。我不确定应该怎么做,但我猜你自己的迭代器存储传入的迭代器(在C :: iterator字段中),然后传递对它的任何调用。