我需要在(0,N)
到false
的范围内设置映射中的所有值。当我简单地遍历该范围并设置该值时,它相当慢,下面的示例大约需要300微秒。
#include <map>
std::map<int, bool> mp;
int N = 600;
for (int i = 0; i < N; i++) {
mp[i] = false;
}
有更快的方法吗?
下面的版本利用了您可以并行进行的事实。 async在单独的线程中执行任务(另请参见launch-policy)。
顺序方法花费0.016s,而并行方法花费0.006s。
#include <vector>
#include <map>
#include <memory>
#include <future>
// end exclusive
void set_m(int begin, int end, std::shared_ptr<std::map<int, bool>> mp)
{
for (int i = begin; i < end; i++)
{
mp->insert({i, false});
}
}
int main()
{
auto mp = std::make_shared<std::map<int, bool>>();
// takes 0m0.016s
set_m(0, 6000 + 1, mp);
// takes 0m0.006s
std::vector<std::future<void>> v;
for (int i = 0; i < 6000; i += 1000)
{
v.push_back(std::async(set_m, i, i + 1001, mp));
}
for (std::future<void> &a : v)
{
a.wait();
}
return 0;
}