Вы должны переделать, как ваш код работает, чтобы быть более абстрактным.
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);
Вы можете пойти дальше и создать потокобезопасные очереди, рабочие потоки и пулы потоков;но все начинается с абстрагирования этого множества.