我有这个模板:
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
答案 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字段中),然后传递对它的任何调用。