C++ でマップの一部だけを反復処理するにはどうすればよいですか? 私の最終的な目標は、複数のスレッドがマップのそれぞれの部分を反復処理し、いくつかの値を計算することです。マップの種類はstd::map<std::string, std::vector<double> >
質問する
455 次
2 に答える
2
C++11でそれを行う簡単な方法は次のとおりです。
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <future>
#include <iostream>
typedef std::map<std::string, std::vector<double>> map_type;
void do_work(map_type::iterator b, map_type::iterator e)
{
std::for_each(b, e, [] (map_type::value_type const& p)
{
std::for_each(p.second.begin(), p.second.end(), [] (double d)
{
/* Process an element of the vector... */
});
});
}
int main()
{
map_type m;
size_t s = m.size();
int quarter = s / 4;
auto i1 = m.begin();
auto i2 = std::next(i1, quarter);
auto i3 = std::next(i2, quarter);
auto i4 = std::next(i3, quarter);
auto i5 = m.end();
std::vector<std::future<void>> futures;
futures.push_back(std::async(do_work, i1, i2));
futures.push_back(std::async(do_work, i2, i3));
futures.push_back(std::async(do_work, i3, i4));
futures.push_back(std::async(do_work, i4, i5));
for (auto& f : futures) { f.wait(); }
}
于 2013-02-27T00:26:44.540 に答える
1
作業を数値で均等に分割したい場合は、おそらく最良のデータ構造ではないマップを作成してください。マップを反復処理し、特定の位置の反復子を見つける必要があります。std::vector のようなランダム アクセス イテレータを提供するコンテナを使用する場合は、イテレータを算術的に計算できます。アルファベット順にしたい場合は、次のようにすることができます。
typedef std::map<std::string,std::vector<double>> data;
void process( data::iterator beg, data::iterator end );
data dt;
{
auto task1 = std::async( process, dt.begin(), dt.lower_bound( "n" ) );
auto task2 = std::async( process, dt.lower_bound( "n" ), dt.end() );
}
すべての文字列が小文字であると仮定します。
于 2013-02-27T00:22:43.887 に答える