我正在嘗試遍歷大型2D矢量(2 mil條目)並獲取一些示例數據。我想出了一個好辦法,就是將我的迭代器隨機移動到一個隨機列中,爲每一行分配一個隨機增量並重復這個過程。使用自定義增量遍歷2D矢量
簡化的代碼:
#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");
}
向量的大小不是恆定的,因此,我真的不能使之成爲一個簡單的for循環,而無需使用迭代器。
此外,我認爲,我認爲,造成這一切的錯誤。 迭代器增量超出範圍,但我仍然不知道如何(優雅地)修復它。
對於大矢量,直到其到達行末工作的代碼。 你有什麼建議可以幫助我。
在此先感謝。
如果您隨後迭代每一行,它不是緩存友好的嗎? – Rakete1111
實際上,我正在對行和列進行採樣,並且它「工作」,直到迭代器到達行/列的末尾。 – nikjohn
我會建議每行使用一個隨機洗牌索引向量,隨機數從該向量索引獲取行數據,當你枚舉。行。它並不特別容易緩存,但我認爲你可能會對結果更加開心,特別是對於更大的矩陣。 – WhozCraig