小编use*_*318的帖子

迭代器中的代理对象

我有一个属于某个类的大项目向量.

struct item {
    int class_id;
    //some other data...
};
Run Code Online (Sandbox Code Playgroud)

相同的class_id可以在向量中出现多次,并且向量构造一次然后按class_id排序.因此,同一类中的所有元素在向量中彼此相邻.

我后来必须处理每个类的项目,即.我更新同一类的所有项目,但我不修改不同类的任何项目.由于我必须为所有项目执行此操作,并且代码可以简单地并行化,因此我希望将Microsoft PPL与Concurrency :: parallel_for_each()一起使用.因此,我需要一个迭代器,并提出了一个前向迭代器,它返回所有项目的范围,并以某个class_id作为代理对象.代理只是一个std :: pair,代理是迭代器的值类型.

using item_iterator = std::vector<item>::iterator;
using class_range = std::pair<item_iterator, item_iterator>;

//iterator definition
class per_class_iterator : public std::iterator<std::forward_iterator_tag, class_range> { /* ... */ };
Run Code Online (Sandbox Code Playgroud)

到现在为止,我能够循环遍历所有类并更新这样的项目.

std::vector<item> items;
//per_class_* returns a per_class_iterator
std::for_each(items.per_class_begin(), items.per_class_end(),
[](class_range r) 
{ 
    //do something for all items in r 
    std::for_each(r.first, r.second, /* some work */);
});
Run Code Online (Sandbox Code Playgroud)

当用Concurrency :: parallel_for_each替换std :: for_each时,代码崩溃了.调试后,我发现问题是ppl.h中第2772行的_Parallel_for_each_helper中的以下代码.

// Add a batch of work items to this functor's …
Run Code Online (Sandbox Code Playgroud)

c++ iterator language-lawyer ppl

11
推荐指数
1
解决办法
1694
查看次数

标签 统计

c++ ×1

iterator ×1

language-lawyer ×1

ppl ×1