質問
各値を反復処理するループを使用せずに、std::map
のすべての値を同じ値に設定する方法は?
解決
C ++にはfill
の<algorithm>
メソッドがありますが、これはマップでは機能しません。実際、連想コンテナに対するアルゴリズムのサポートは一般に良くありません。
その結果、インターレーションを使用するか、適切なファンクターを記述してfor_each
で使用する必要があります(ただし、これは不要なオーバーヘッドであると考えています):
template <typename TKey, typename TValue>
struct resetter : public std::unary_function<std::pair<TKey, TValue> > {
TValue const value;
public resetter(value const& v) : value(v) { }
public void operator ()(std::pair<TKey, TValue>& v) {
v.second = value;
}
};
for_each(map.begin(), map.end(), resetter<Key, Value>(value));
他のヒント
同じ問題が発生しましたが、boost :: adaptors :: valuesによって返される範囲が可変であるため、std :: fillなどの通常のアルゴリズムで使用できることがわかりました。
#include <boost/range/adaptor/map.hpp>
auto my_values = boost::adaptors::values(my_map);
std::fill(my_values.begin(), my_values.end(), 123);
boost :: assignライブラリには、コンテナの内容を初期化するのに役立つあらゆる種類のきちんとしたものがあります。これは、マップを明示的に繰り返すことを回避するために使用できると考えました。残念ながら、キーは一意である必要があるため、マップは初期化するのが難しい奇妙な獣です。一番下の行は、単純なforループがおそらくマップを初期化する最良の方法であるということです。非常にエレガントではないかもしれませんが、仕事を成し遂げ、STLに精通している人なら誰でもすぐに理解できます。
map <int,string> myMap;
for( int k=0;k<1000;k++)
myMap.insert(pair<int,string>(k,string("")));
この投稿の残りの部分では、上記の結論に到達するまでの道のりについて説明します。
boost :: assignにより、少数の値をマップに簡単に割り当てることができます。
map<string,int> m;
insert( m )( "Bar", 1 )( "Foo", 2 );
または
map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
同じ値でマップ全体を初期化する場合、repeatおよびrepeat_funユーティリティがあります。
このようなものはマルチマップ(テストされていないコードスニペット)で動作するはずです
pair<int,string> init( 0,string(""));
multimap <int,string> myMap = repeat(1000,init);
指摘されているKonrad Rudolphのように、キーは一意でなければならないため、同じ正確な値でマップを初期化することはできません。
これにより、人生がより複雑になります(楽しい?)。このようなもの、おそらく:
map <int,string> myMap;
struct nextkey
{
int start;
nextkey( s ) : start( s ) {}
pair<int,string> operator () ()
{
return pair<int,string>(start++,string(""));
}
};
myMap = repeat_fun(1000,nextkey(0));
今、これは非常に複雑になっているので、単純な繰り返しが進むべき方法だと思います
<*>