2016-11-25 11 views
2

大きな2Dベクトル(2milのエントリ)を反復処理し、いくつかのサンプルデータを取得しようとしています。私は、イテレータをランダムな列に無作為にシフトし、ランダムな増分を割り当て、すべての行に対してこのプロセスを繰り返すという、良い方法を考え出しました。カスタムインクリメントを使用して2次元ベクトルを反復する

簡体コード

#include <iostream> 
#include <iterator> 
#include <vector> 
#include <ctime> 

using namespace std; 


int main() 
{ 
    srand((unsigned)time(0)); 
    float _mean = 0; 
    vector<vector<size_t>> v{ { 1,2,3 },{ 4,5,6 },{ 7,8,9 } }; 
    vector<vector<size_t> >::iterator row; 
    vector<size_t>::iterator column; 
    size_t i = 0; 
    size_t shift, inc; 
    for (row = v.begin(); row < v.end(); ++row) 
    { 
     shift = rand() % 10; 
     inc = rand() % 6; 

     for (column = row->begin()+shift; column < row->end(); column += inc) // row downshift 
     { 
      _mean += *column; 
      ++i; 
     } 
    } 
    cout << _mean/i << endl; 
    system("pause"); 

} 

ベクトルの大きさは、それゆえ、私は本当にイテレータを使用せずにループするためのシンプルな中にそれを作ることができない一定ではありません。

また、私は、このすべての原因となるエラーを特定しました。 イテレータは範囲外のをインクリメントしますが、私はそれを(エレガントに)修正する方法はまだ分かりません。

大ベクターコードが行の最後に到達するまで。 私に助けとなる提案がありますか?

ありがとうございます。

+0

その後、すべての行を繰り返し処理するとキャッシュが使い勝手が悪いですか? – Rakete1111

+0

実際は、行と列の両方をサンプリングしており、イテレータが行/列の最後に到達するまで「動作」します。 – nikjohn

+0

列ごとにランダムシャッフルされたインデックスベクトルを使用し、そのベクトルからランダムな数のインデックスを取得し、列挙する行データを取得することをお勧めします。行。特にキャッシュに優しいわけではありませんが、おそらく結果がより幸せになると思います。 – WhozCraig

答えて

1

二つの問題があります。

  • あなたが最後のイテレータは他のイテレータ未満のために比較することができると仮定することはできませんが。これはrandom iterators(幸運にもベクトルの場合)でのみ有効です。有効な場合、つまり範囲内である場合(コードでは正確に保証されていない場合)にのみ有効です。したがって、条件はcolumn != row->end()でなければなりません。
  • inc>1の場合は最後を逃す危険があります。また、最終イテレータの正確な値が不足している場合は、

最も簡単な選択肢は次のようになります。

for (int column = shift; column < row->size(); column += inc) // row downshift 
    { 
     _mean += (*row)[column]; 
     ++i; 
    } 

PS: *あなたは時折無限ループにつながる0のincを得ることができることに注意してください(WhozCraigのコメントを参照してください) 。次のように決定してください。inc = (rand() % 5) + 1;

+0

@ n.m。私は一方で、私の思考をより正確に表現するために編集しました(イテレータカテゴリに余分なリンクがあります)。 – Christophe

+2

もしOPが 'rand()%6'の結果が' 0'になるのに十分不利であれば、車輪もアルゴリズムから落ちます。これは完全に可能です。その場合、ループは無限になります。 – WhozCraig

+0

@Christopheの列と行は反復子にすぎず、代入演算子やメソッドbegin()とend()は使用できません。 – nikjohn

関連する問題