C++ 通过数组的异步列迭代

C++ 通过数组的异步列迭代,c++,arrays,algorithm,vector,random,C++,Arrays,Algorithm,Vector,Random,我试图解决以下算法问题: 我得到了一个数组(它可以是标准的C/C++数组,一个向量,或者其他什么……任何最适合这个问题的都可以)填充随机非零值。我知道数组的大小,mxn 我想做的是(直接或通过等效方法)完成以下任务:迭代所有n列,直到找到超过某个阈值的值,t。继续在其余列中迭代,直到找到t上的另一个值,或者达到某个最大迭代次数 如果已达到最大迭代次数,我将从这里继续迭代所有n列,直到再次遇到超过阈值t的值。如果发现第二个值超过该阈值,我将继续,直到发现第三个值超过t,或者从第一个值开始达到最大迭

我试图解决以下算法问题:

我得到了一个数组(它可以是标准的
C/C++
数组,一个
向量
,或者其他什么……任何最适合这个问题的都可以)填充随机非零值。我知道数组的大小,
mxn

我想做的是(直接或通过等效方法)完成以下任务:迭代所有
n
列,直到找到超过某个阈值的值,
t
。继续在其余列中迭代,直到找到
t
上的另一个值,或者达到某个最大迭代次数

如果已达到最大迭代次数,我将从这里继续迭代所有
n
列,直到再次遇到超过阈值
t
的值。如果发现第二个值超过该阈值,我将继续,直到发现第三个值超过
t
,或者从第一个值开始达到最大迭代次数

如果我达到最大迭代次数,我将继续遍历所有
n
列,直到再次遇到超过阈值
t
的值。若我找到第三个值,我将一个值加到某个计数中,然后继续迭代所有
n

所以,最后我要么在三个唯一的列中找到三个超过阈值的值,要么没有,然后从第一个找到的值+最大迭代次数开始搜索


我不知道该怎么做。我有一些想法:

  • 保留某种迭代器列表,每列一个。不过,我不知道从那以后我会去哪里
  • 有一个类似于for(int i=0,j=0,k=0…)的for循环,每列有一个迭代器,并在循环中使用if语句更改迭代器的值。这很快就会变得非常复杂,尤其是对于大型数组
  • 使用嵌套的for循环遍历每一行。找到第一个值时,将列索引保存到
    std::set
    。在
    0
    处启动迭代器。继续迭代,每次找到一个,将找到的阈值列添加到集合中。每次检查集合大小是否为3。如果集合大小为3,则添加到计数。当迭代器s达到最大值,重置为
    0
    并清空集合
我的目标:

  • 最重要的是可读性。许多其他人会阅读和使用它。我知道我可能需要嵌套循环之类的,但我希望尽可能避免混乱
  • 速度。我正在研究列数为数十的数组,行数为数千或数万的数组。最理想的情况是,代码应该能够在几分钟内“扫描”数组(我知道这有点不稳定,有很多因素在起作用,但希望这能给人一些“约束”的感觉)
如果知道是有用的,则随机值来自高斯分布,已知值为
mu
sigma

编辑:


下面是一个未完成的粗略尝试。但还不确定它是否有效:

#define sigma 10
#define threshold 2
#define row_threshold 10

void myAlgo(){

    // Fill the array with random values

    vector<vector<float> > myVector;
    my_vector.resize(1000, vector<float>(50));

    for(int i = 0, j = 0; i < 1000 && j < 50; ++i, ++j){
        my_vector[i][j] = gRandom->Gaus(0, sigma)
    }

    std::set temp;
    int counter = 0;
    int found   = 0;

    for(vector<float> row : my_vector){

        std::vector<int>::iterator :: it = std::find(row.begin(), row.end(),
                                           [](int cell){ return cell > threshold; });

        temp.insert(std::distance(row.begin(), it));

        ++counter

        if(temp.size() == 3) ++found;

        if(counter == row_threshold){
            counter = 0;
            temp.clear();
        }

    }
    
}