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

C++: How to call a function whenever an element is added to a set?

本文关键字:何调用 函数 调用 元素 集合 添加 C++      更新时间:2023-10-16

我有两个函数。第一个用元素填充一个集合:

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需要很长时间才能完成,因此我想要一种在每次向myset添加新元素时应用func的方法,实现部分并行性。有什么办法可以在C++做到这一点吗?

你应该重新设计代码的工作方式,使其更加抽象。

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

您可以更进一步,创建线程安全队列以及工作线程和线程池;但这一切都始于抽象出该集合。