在std::for_each中传递vector的位置

Pass vector position in std::for_each

本文关键字:vector 位置 each std for      更新时间:2023-10-16

我有一个稀疏压缩列格式的数据结构。

对于给定的算法,我需要遍历数据"列"中的所有值并做一堆事情。目前,使用常规的for循环可以很好地工作。老板想让我把这个重新编码为for_each循环,以便将来并行化。

对于那些不熟悉稀疏压缩列的人来说,它使用2(或3)个向量来表示数据。一个向量就是一长串值。第二个向量是每列起始位置的索引。

当前版本//用于处理第5列的数据矢量值;向量colIndex;向量rowIndex;

int column = 5;
for(int i = conIndex[5]; i != colIndex[6]; i++){
    value = values[i];
    row = rowIndex[i];
    // do stuff
}

关键是我需要知道的位置(作为一个整数)在我的值列为了查找行位置(和一堆其他的东西,我懒得在这里列出)

如果我使用std::for_each()函数,我得到的是位置上的值,而不是位置。我需要位置本身。

有一个想法,显然效率不高,那就是创建一个与我的数据长度相同的整数向量。这样,我就可以将虚拟向量的迭代器传递给for_each中的函数,传递给函数的值就是位置。然而,这似乎是效率最低的方法。

任何想法吗?

我的挑战是我需要知道在向量中的位置。For_each接受一个迭代器,并将该迭代器的值发送给函数。

使用boost::counting_iterator<int>,或者自己实现。

的答案可能是最好的,但只有标准库提供的才有可能,尽管我认为速度很慢:

void your_loop_func(const T& val){
    iterator it = values.find(val);
    std::ptrdiff_t index = it - values.begin();
    value = val;
    row = rowIndices[index];
 }

写完之后,我真的只能推荐Boost counting_iterator版本。div;)