在std :: for_each中传递矢量位置

时间:2011-09-18 00:34:15

标签: c++ stl

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

对于我给定的算法,我需要迭代数据“列”中的所有值并执行一些操作。目前,它使用常规for循环很好地工作。老板希望我将其重新编码为for_each循环,以便将来进行并行化。

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

当前版本     //用于处理第5列中的数据     矢量值;     矢量colIndex;     vector 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中的函数,传递给我函数的值将是postion。然而,这似乎是效率最低的方式。

有什么想法吗?

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

2 个答案:

答案 0 :(得分:4)

使用boost::counting_iterator<int>,或实施自己的。

答案 1 :(得分:1)

@n.m.的回答可能是最好的,但只有标准库提供的内容才有可能,但我认为这很慢:

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版本。 ;)