在 TBB parallel_for循环中获取迭代器
Getting iterators within TBB parallel_for loop
我在概念上简单的代码上遇到了问题。我需要从循环内的向量中收集一些迭代器,并且我想使用 TBB 功能来并行化此循环。这里有一个最小(不是)工作的例子:
#include <tbb/tbb.h>
#include <vector>
int main()
{
std::vector<int> v{1,2,3,4,5,6,7,8};
tbb::concurrent_vector<decltype(v)::iterator> cv;
tbb::parallel_for(std::begin(v), std::end(v), [&](const auto& iter)
{
cv.emplace_back(iter);
});
}
如您所见,我对迭代器感兴趣,而不是值。我可以使用指针或引用包装器完成类似的事情(下面是下面的示例),但我想了解我无法做我想做的事的原因......
#include <tbb/tbb.h>
#include <vector>
int main()
{
std::vector<int> v{1,2,3,4,5,6,7,8};
tbb::concurrent_vector<std::reference_wrapper<decltype(v)::value_type>> cv;
tbb::parallel_for_each(std::begin(v), std::end(v), [&](auto& element)
{
cv.emplace_back(std::ref(element));
});
}
您正在尝试使用以下parallel_for
重载:
template <typename Index, typename Function>
void parallel_for(Index first, Index last, const Function& f);
此重载需要两个索引来指定块范围。Index
类型必须转换为整数,以便在函数体(即您指定的 lambda)中,您可以使用 v[index]
来访问(索引)向量的元素。
传递给此重载,并且编译器无法将这些迭代器转换为整数,因此出现错误。
解决方案如下:
tbb::parallel_for(static_cast<std::size_t>(0), v.size(), // use index to specify the range
[&](std::size_t index) {
cv.emplace_back(v.begin() + index); // access element with v[index]
});
相关文章:
- Boost Spirit,获取迭代器内部语义动作
- 使用“decltype”获取迭代器的类型
- 为什么它不能在 c++ 中获取迭代器作为引用
- 从满足谓词的迭代器中均匀随机的容器中获取迭代器
- 获取迭代器错误的位置
- 获取迭代器在基类型 "intrusive doubly linked list" 的指针字典中的位置
- 获取迭代器返回的字符串的大小()
- 获取迭代器范围的每个第 n 个元素
- 从指针或引用获取迭代器
- std::min_element 获取迭代器的结果
- 使用std::find_if时,从传递给lambda的元素中获取迭代器
- 获取迭代器正在引用的STL容器的指针
- 获取迭代器以供常量参考
- 从指针获取迭代器
- 在(私有)继承向量<string>上获取迭代器
- 从Range Type中获取迭代器类型
- 通过值/引用传递vector并从中获取迭代器
- 试图从容器获取迭代器时出现编译错误
- 获取迭代器的位置??C++
- 从任何结构或元组按字符串形式的字段键获取迭代器