首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::for_each中的Pass矢量位置

std::for_each中的Pass矢量位置
EN

Stack Overflow用户
提问于 2011-09-18 00:34:15
回答 2查看 752关注 0票数 3

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

对于给定的算法,我需要迭代数据“列”中的所有值,并执行大量的操作。目前,它正在很好地使用一个普通的for循环。老板想让我把它重新编码为一个for_each循环,以便将来并行化。

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

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

代码语言:javascript
复制
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接受一个迭代器并将该迭代器的值发送给函数。

EN

回答 2

Stack Overflow用户

发布于 2011-09-18 00:39:06

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

票数 4
EN

Stack Overflow用户

发布于 2011-09-18 00:47:08

@N.M.的答案可能是最好的,但只有标准库提供的东西才有可能,尽管我认为它缓慢得令人痛苦:

代码语言:javascript
复制
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版本了。;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7458770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档