我正在尝试遍历大型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