实现自己的begin()和end()
Implementing own begin() and end()
我有这个模板:
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::迭代器字段中),然后将任何调用传递给它。
相关文章:
- 没有为自己的结构调用列表推回方法
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- C++从对象自己的类中删除对象
- 使用 std::optional,而不是自己的结构
- 反转依赖于 end() 的迭代器
- 子轴围绕父轴而不是他自己的轴旋转
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++ 如何为自己的迭代器类从迭代器转换为const_iterator?
- 重载 + 自己的类和 std::string 的运算符
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何访问模板参数自己的模板参数?
- 将矩阵乘以我自己的输入的向量
- 您应该在什么时候创建自己的异常类型
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- string1 == string2 和你自己的 for 循环比较有什么区别?
- 如何正确包含我自己的标头?
- 自己的自定义向量类. 内存重新分配
- 实现自己的begin()和end()