2010-12-06 57 views
4

我有一个需要换一个向量迭代器,但不喜欢这个主意,从头开始重写。而且我无法将它继承,只要向量迭代器似乎不是跨平台的。至少gnu和ibm的看起来不一样。包装的std ::迭代器,C++

我想要做的是:

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; 

当指数矢量包含的数据向量中的整数位置。数据应该比索引大得多。

所以我需要一个迭代器,可以顺利通过指数在任意方向上像一个正常的向量迭代器,唯一的例外的作用:当该值将要访问它必须返回数据向量的值。例如:

for(MyContainer::iterator it = cont.begin(); it != cont.end(); it++) { 
    cout << *it << endl; // values of data should appear here 
} 

基本上它应该看起来像标准世界的正常集合。你可以在任何你想要的方向,你可以对它进行排序迭代,运行独特,find_if等..

任何简单的解决办法?

+1

如果我明白了,你真的有双打的向量和索引向量是没有意义的。或者,也许我错了,我没有清楚你真正想要达到的目标。 – birryree 2010-12-06 15:52:43

+0

我有两个向量。一个包含一个大数据集(10k个元素)。指数将指向数据集中的一个子集。像这样:indices = {1,2,5,1000};我想遍历容器,就好像我会通过索引向量一样,但返回的值必须从数据向量中获取。 – 2010-12-06 15:56:26

回答

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得到休息。

祝你好运!

2

没有什么标准C++库,但你可能可以得到boost::iterator_adapter做你想要什么。初步检查表明您需要覆盖iterator_adapter::dereferenceiterator_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: 
    // ... 
}