gpt4 book ai didi

c++ - cpp迭代器继承

转载 作者:太空狗 更新时间:2023-10-29 20:44:38 25 4
gpt4 key购买 nike

我的要求与提出的问题相同Using Iterators to hide internal container and achieve generic operation over a base container [ 1 ] 在计算器。我有一个通用的纯虚拟基础容器类,它需要提供一个迭代器,它应该是 STL 投诉,所以我可以将它们与 cpp 算法的 #include <algorithm> 一起使用。 .我的实现只使用一个类而不是 [ 1 中的两个类。 ] 解决方案。

基础纯虚类

class BaseItr
{
public:
class iterator : public std::iterator<std::input_iterator_tag, int>
{
public:
iterator() : _in(NULL) {}
inline iterator(const iterator& org) : _in(org._in) {}
inline iterator& operator=(const iterator& other) { _in = other._in; return *this; }
virtual inline int operator * () { return _in->operator*(); }
virtual inline iterator& operator++() { (*_in)++; return *this; }
virtual inline iterator& operator++(int unused) { (*_in)++; return *this; }
virtual inline bool operator==(const iterator& other)
{
return *(*_in) == *(*(other._in));
}
virtual inline bool operator!=(const iterator& other)
{
return *(*_in) != *(*(other._in));
}
// would use shared pointer insted of this
//~iterator() { if(_in) { delete _in; } }
static inline iterator New(iterator *in) { return iterator(in); }
private:
iterator(iterator *in) : _in(in) {}
iterator *_in;
};

virtual iterator begin() = 0;
virtual iterator end() = 0;
};

实现

class Itr : public BaseItr
{
private:
class iterator : public BaseItr::iterator
{
public:
iterator(int val) : _val(val), BaseItr::iterator() {}
int operator * () { return _val; }
inline iterator& operator++() { ++_val; return *this; }
inline iterator& operator++(int unused) { _val++; return *this; }
private:
int _val;
};
BaseItr::iterator _begin;
BaseItr::iterator _end;
public:
inline Itr(int start, int end)
{
_begin = BaseItr::iterator::New(new iterator(start));
_end = BaseItr::iterator::New(new iterator(end));
}

BaseItr::iterator begin() { return _begin; }
BaseItr::iterator end() { return _end; }
};

我的实现工作是需要的,我想知道这个实现有什么缺点,请帮助我决定我的设计使用适当的实现。我已经在 github:gist https://gist.github.com/3847688 中添加了完整的工作示例代码

引用:

最佳答案

最明显的问题:您的迭代器没有值语义。

STL 算法可以根据需要自由复制迭代器。例如假设:

template <typename It>
It find(It b, It e, typename std::iterator_traits<It>::const_reference t) {
for (; b != e; ++b) {
if (*b == t) { return b; }
}
return e;
}

问题在于,如果您使用 BaseItr& 调用此算法,则结果的类型为 BaseItr,因此您会接触到对象切片,这是未定义的行为

为了给迭代器提供值语义,您需要围绕抽象实现创建一个包装器类,并让包装器通过虚拟 clone 方法正确管理拷贝。 如果您的迭代器以虚方法结尾,那您就做错了。

关于c++ - cpp迭代器继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12768087/

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