使用自定义增量

时间:2016-11-25 21:43:58

标签: c++ vector iterator

我正在尝试迭代一个大的2D矢量(2 mil条目)并获得一些样本数据。我想出一个好方法,就是将我的迭代器随机移动到一个随机列,分配一个随机增量并为每一行重复这个过程。

简化代码

#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循环。

另外,我认为,我认为导致这一切的错误。 迭代器增量超出范围,但我仍然不知道如何(优雅地)修复它。

对于大型向量,代码可以,直到它到达行尾。 你有什么建议可以帮助我吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

有两个问题:

  • 您不能假设可以比另一个迭代器比较结束迭代器。这仅适用于random iterators(幸运的是它是矢量的情况)并且只有在它们有效时,即在范围内(在代码中无法保证)。所以for-condition应该是column != row->end()
  • 如果你inc>1并且错过了结束迭代器的确切值,你可能会错过结束。

最简单的选择是:

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

PS: *请注意,您偶尔会得到inc 0,这会导致无限循环(请参阅WhozCraig&# 39;评论)。最好用inc = (rand() % 5) + 1;

来确定它