2010-12-06 84 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: 
    // ... 
}