我有两个职能。第一个用元素填充集合:
void fill_set(set<string> & theset, int number)
其中number
是要放入集合中的元素数。然后将一个函数应用于集合中的每个元素。
set<string> myset;
vector<float> results;
fill_set(myset,1000000);
for (auto const & s : myset)
results.push_back(func(s));
问题在于,fill_set
完成需要很长时间,因此我希望有一种方法可以在每次向func
添加新元素时应用myset
。部分并行。在C ++中有什么方法可以做到这一点?
答案 0 :(得分:0)
您应该重新编写代码,使其变得更加抽象。
template<class T> using sink=std::function<void(T)>;
现在fillmset变为:
void fill_set(sink<string> thesink, int number);
而不是theset.insert(foo)
,而是呼叫thesink(foo)
。
然后重构:
set<string> myset;
vector<float> results;
fill_set([&](auto x){myset.insert(std::move(x));},1000000);
for (auto const & s : myset)
results.push_back(func(s));
并重构:
set<string> myset;
vector<float> results;
fill_set([&](auto s){
auto worked = myset.insert(std::move(s));
if(worked.second)
results.push_back(func(s));
},1000000);
您可以走得更远,使线程安全队列以及工作线程和线程池成为可能;但这一切都始于抽象出那个集合。