我需要包装一个矢量迭代器,但不喜欢从头开始重写它的想法。而且我不能将它子类化,因为矢量迭代器似乎不是跨平台的。至少gnu和ibm看起来不同。
我想做的是以下内容:
class MyContainer {
vector<double> data;
vector<int> indices;
iterator
begin()
{ return my_iterator(data, indices.begin()); }
iterator
end()
{ return my_iterator(data, indices.end()); }
}
MyContainer cont;
其中索引向量包含数据向量中的整数位置。数据应该比指数大得多。
所以我需要一个迭代器,它可以在任何方向上遍历索引,就像普通的向量迭代器那样唯一的例外:当要访问该值时,它必须返回数据向量的值。 e.g:
for(MyContainer::iterator it = cont.begin(); it != cont.end(); it++) {
cout << *it << endl; // values of data should appear here
}
基本上它应该看起来像std世界的普通集合。你可以在任何你想要的方向迭代它,你可以对它进行排序,运行唯一,find_if等...
任何简单的解决方案?
答案 0 :(得分:6)
这是一个很棒的Boost库,用于定义自定义迭代器。您需要提供一些包含几种方法的类:
i.dereference() Access the value referred to
i.equal(j) Compare for equality with j
i.increment() Advance by one position
i.decrement() Retreat by one position
i.advance(n) Advance by n positions
i.distance_to(j) Measure the distance to j
然后你从iterator_facade获得剩下的部分。
祝你好运!答案 1 :(得分:4)
这看起来很像permutation_iterator,Boost.Iterator Library
中的“内置”适配器之一在键盘上查看this example(从Boost文档修改)。
答案 2 :(得分:2)
标准C ++库中没有任何内容,但您可以boost::iterator_adapter
来完成您想要的操作。初步检查表明您需要覆盖iterator_adapter::dereference
和iterator_adapter::equal
。
template <typename _Scalar=double,
typename _Idx=int,
typename _Seq=std::vector<_Scalar>,
typename _IdxVector=std::vector<_Idx> >
class SelIter
: public boost::iterator_adaptor< SelIter<_Scalar, _Idx>,
typename _IdxVector::iterator, _Scalar >
{
public:
typedef boost::iterator_adaptor< SelIter, typename _IdxVector::iterator, _Scalar > Base;
SelIter(_Seq& scalars, _IdxVector& idxs);
SelIter(_Seq& scalars, typename _IdxVector::iterator pi);
typename Base::reference dereference() const;
bool equal(const SelIter& x) const;
private:
// ...
}