C ++:每当将元素添加到集合中时,如何调用函数?

时间:2018-12-24 21:11:03

标签: c++ parallel-processing

我有两个职能。第一个用元素填充集合:

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 ++中有什么方法可以做到这一点?

1 个答案:

答案 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);

您可以走得更远,使线程安全队列以及工作线程和线程池成为可能;但这一切都始于抽象出那个集合。