2010-12-06 13 views
4

私はベクトルイテレータをラップする必要がありますが、最初から書き直すという考えは嫌いです。そして、私はベクトル反復子がクロスプラットフォームでないように見える限り、それをサブクラス化することはできません。少なくともgnuとibmのものは異なって見えます。ベクトルのインデックスC++でstd :: iteratorをラップします

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 
} 

基本的にstdワールドの通常のコレクションのように見えます。あなたは、あなたが望むどんな方向にでも反復することができます。あなたはそれをソートし、ユニークなfind_ifを実行することができます。

簡単な解決法はありますか?

+1

私が理解すれば、実際には2倍のベクトルがあり、インデックスベクトルは無意味です。あるいは、私が間違っているかもしれません、あなたが本当に達成しようとしていることについての明確な印象を得ていません。 – birryree

+0

私は2つのベクトルを持っています。 1つに大きなデータセット(10k要素)が含まれています。インデックスは、データセットのサブセットを指します。このように:indices = {1、2、5、1000};私はインデックスベクトル上でそれを行うかのようにコンテナを反復したいが、返される値はデータベクトルから取られなければならない。 –

+0

@birryee、私の推測は、 'indices'ベクトルの値は実際に' data'ベクトルのインデックスであり、 'data'ベクトルの値をイテレータが参照する現在のインデックスに出力したいと考えています。 –

答えて

4

これはpermutation_iteratorのようにたくさん見える、Boost.Iterator Library

からアダプタ「に建てられた」の一つはcodepadに(ブーストのドキュメントから変更)this exampleを参照してください。

+0

同様ですが、 'permutation_iterator'はインデックスの連続した範囲を置き換えます。 OPは 'comby_iterator'をもっと必要とします(存在していれば)、zheはいくつかのインデックスをスキップできます。 – outis

+0

@outis:私はインデックスの範囲が連続していなければならないとは思わない。ページの下部にある例を見てください。 "indices"は例の中で連続した数字でしか書かれていない "リスト"ですが、他のものを含むことができます。 –

+0

@outis:コードパッドに連続していないインデックスの例を作成しました。私の答えのリンクを参照してください。 –

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: 
    // ... 
} 
関連する問題