2011-09-18 6 views
3

私は、疎圧縮列形式のデータ構造を持っています。私の指定されたアルゴリズムについてはstd :: for_eachのベクトル位置を渡す

、私はデータの「列」内のすべての値を反復処理し、原料の束を行う必要があります。現在、通常のforループを使用してうまく動作しています。上司は、これを将来の並列化のためのfor_eachループとして再コーディングしたいと思っています。スパース圧縮カラムに精通していないものについて

、データを表すために2(または3)ベクターを用います。 1つのベクトルは値の長いリストです。 2番目のベクトルは、各列の開始位置のインデックスです。

現在のバージョン //列5のデータを処理中。 ベクトル値。 ベクトルcolIndex; ベクトルrowIndex;

int column = 5; 
for(int i = conIndex[5]; i != colIndex[6]; i++){ 
    value = values[i]; 
    row = rowIndex[i]; 
    // do stuff 
} 

キーは、私は、行の位置(そして、私はここに一覧表示するには悩まないよ、他の原料の束をルックアップするために、私の値の列に(整数として)場所を知っておく必要があるということです。)

私がのstd :: for_each()関数を使用している場合は、私は位置ではなく、位置の値を取得します。私は自分自身の位置が必要です。

一つの思想、と明らかに効率的ではないが、整数私のデータと同じ長さのベクトルを作成することです。そうすれば、私はそのダミーベクトルを介してfor_eachの関数にイテレータを渡すことができ、私の関数に渡される値はその位置になります。しかし、これは最も効率の悪い方法のようです。

どのような考えですか?

私の挑戦は、ポジションをベクターで知る必要があることです。 for_eachはイテレータを受け取り、そのイテレータの値を関数に送ります。

答えて

4

使用boost::counting_iterator<int>、または自分自身を実装します。

void your_loop_func(const T& val){ 
    iterator it = values.find(val); 
    std::ptrdiff_t index = it - values.begin(); 
    value = val; 
    row = rowIndices[index]; 
} 

て、それを書いた後、私は実際にはお勧めすることができます:痛々しいほど遅い私は仮定しても、ナノメートルの答え@

1

は、おそらく最高のですが、それは標準ライブラリが提供するものだけで可能ですブーストcounting_iteratorバージョン。 ;)

関連する問題