C ++: Как вызывать функцию всякий раз, когда элемент добавляется в набор? - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть две функции.Первый заполняет набор элементами:

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 голосов
/ 25 декабря 2018

Вы должны переделать, как ваш код работает, чтобы быть более абстрактным.

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

Вы можете пойти дальше и создать потокобезопасные очереди, рабочие потоки и пулы потоков;но все начинается с абстрагирования этого множества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...