gpt4 book ai didi

c++ - 比较两个不同的 boost::iterator_facade 迭代器

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

我有两个迭代器,都派生自 boost::iterator_facade(但不是彼此派生),我希望能够比较它们,因为我不希望有更多的 end() 方法,当一个方法就足够了。可能吗?

以下最小示例对我不起作用,但我认为它应该。我做错了什么?

#include <vector>
#include <iostream>

#include <boost/iterator/iterator_facade.hpp>

using namespace std;

typedef vector<int> val_type;
typedef vector<val_type> vec_type;

class myiterator
: public boost::iterator_facade<
myiterator
, val_type
, boost::forward_traversal_tag
>
{
private:
friend class boost::iterator_core_access;
friend class base_myiterator;

public:
explicit myiterator(vec_type::iterator _it)
: it(_it)
{}

myiterator(myiterator const& other)
: it(other.it)
{}

private:
void increment() { ++it; }

bool equal(myiterator const& other) const
{
return (it == other.it);
}

val_type& dereference() const { return *it; }

vec_type::iterator it;
};

class base_myiterator
: public boost::iterator_facade<
base_myiterator
, val_type
, boost::forward_traversal_tag
>
{
private:
friend class boost::iterator_core_access;

public:
explicit base_myiterator(vec_type::const_iterator _it, val_type _base)
: base(_base),
it(_it)
{
idx.resize(base.size());
}

base_myiterator(base_myiterator const& other)
: base(other.base),
it(other.it)
{
idx.resize(base.size());
}

private:

void increment()
{
++it;
for (size_t i=0; i<base.size(); ++i)
{
idx[i] = base[i] + (*it)[i];
}
}

bool equal(base_myiterator const& other) const
{
return (it == other.it);
}

bool equal(myiterator const& other) const
{
return (it == other.it);
}

val_type const& dereference() const
{
return idx;
}

val_type base;
vec_type::const_iterator it;
val_type idx;
};

struct Sample
{
vec_type vec;

myiterator begin()
{
return myiterator(vec.begin());
}

base_myiterator begin(val_type const& base)
{
return base_myiterator(vec.begin(), base);
}

myiterator end()
{
return myiterator(vec.end());
}
};

int main ()
{
Sample s;

val_type val;
val.push_back(1); val.push_back(0);
s.vec.push_back(val);
val.clear(); val.push_back(0); val.push_back(1);
s.vec.push_back(val);

val.clear(); val.push_back(-5); val.push_back(5);

//for (myiterator it=s.begin(); it!=s.end(); ++it)
for (base_myiterator it=s.begin(val); it!=s.end(); ++it)
{
cout << (*it)[0] << " " << (*it)[1] << endl;
}
}

最佳答案

boost::iterator_facade 检查两个迭代器是否为 interoperable在实例化关系运算符之前。

它使用 boost::type_traits::is_convertible 来检查将一种类型的迭代器转换为另一种类型是否合法。因此,如果您添加构造函数 base_myiterator(myiterator const& other) 它将起作用。它将使用您提供的特殊 equal 重载并且不进行任何转换(即不会使用额外的复制构造函数,它只需要在那里)。

此外,base_myiterator 似乎作为某种 const_iterator (val_type const& reference() const) 运行。在这种情况下,您应该将 val_type const 作为模板参数值传递给 iterator_facade,如 here 所述。 .

关于c++ - 比较两个不同的 boost::iterator_facade 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17155988/

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