gpt4 book ai didi

c++ - 来自模板化迭代器的 boost::iterator_range

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:53:32 26 4
gpt4 key购买 nike

我正在尝试编写 Python 的 itertools.tee 的 C++ 版本对于 Boost::Range(如 here 所示)。这是我的第一次尝试:

template<typename R>
class tee_iterator : std::iterator<std::forward_iterator_tag, typename boost::range_value<R>::type>
{
public:
typedef typename boost::range_value<R>::type T;
typedef std::list<T> tee_queue;
typedef std::vector<tee_queue> tee_queue_collection;

tee_iterator(const R& r, tee_queue* q, tee_queue_collection* qs) :
it_(r.begin()), queue_(q), queues_(qs) {}

tee_iterator(const R& r) : it_(r.end()), queue_(NULL), queues_(NULL) {}

T& operator*() const { return current_; }

tee_iterator& operator++()
{
if (queue_->empty()) {
++it_;
for (auto q : queues_) {
q->push_back(*it_);
}
}
current_ = queue_->front();
queue_->pop_front();
return *this;
}

bool operator==(tee_iterator const& o) const { return it_ == o.it_; }
bool operator!=(tee_iterator const& o) const { return !(*this == o); }

private:
typedef typename boost::range_iterator<const R>::type const_iterator;
const_iterator it_;
tee_queue* queue_;
tee_queue_collection* queues_;
T current_;
};

template<typename R>
using tee_range = boost::iterator_range<tee_iterator<R> >;

template<typename R>
std::list<tee_range<R> > tee(const R& r, int n)
{
typedef typename boost::range_value<R>::type T;
typedef std::list<T> tee_queue;
typedef std::vector<tee_queue> tee_queue_collection;

tee_queue_collection queues(n);
std::list<tee_range<R> > ranges;
for (int i = 0; i < n; ++i) {
tee_range<R> t = { tee_iterator<R>(r, &queues[i], &queues), tee_iterator<R>(r) };
ranges.push_back(t);
}
return ranges;
}

但是一旦我尝试使用它:

int main(int argc, char* argv[])
{
std::list<int> l;
for (int i = 0; i < 10; ++i) {
l.push_back(i);
}
auto t = tee(l, 3);
}

它吹在我的脸上,提示失踪 value_typeboost::detail::iterator_traits<tee_iterator<std::list<int, std::allocator<int> > > > (和别的)。我错过了什么?不是 tee_iterator作为 std::iterator 的 child 够了吗?

最佳答案

您忘记添加public:

class tee_iterator : public std::iterator...

关于c++ - 来自模板化迭代器的 boost::iterator_range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13186718/

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