大きな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");
}
ベクトルの大きさは、それゆえ、私は本当にイテレータを使用せずにループするためのシンプルな中にそれを作ることができない一定ではありません。
また、私は、このすべての原因となるエラーを特定しました。 イテレータは範囲外のをインクリメントしますが、私はそれを(エレガントに)修正する方法はまだ分かりません。
大ベクターコードが行の最後に到達するまで。 私に助けとなる提案がありますか?
ありがとうございます。
その後、すべての行を繰り返し処理するとキャッシュが使い勝手が悪いですか? – Rakete1111
実際は、行と列の両方をサンプリングしており、イテレータが行/列の最後に到達するまで「動作」します。 – nikjohn
列ごとにランダムシャッフルされたインデックスベクトルを使用し、そのベクトルからランダムな数のインデックスを取得し、列挙する行データを取得することをお勧めします。行。特にキャッシュに優しいわけではありませんが、おそらく結果がより幸せになると思います。 – WhozCraig