私はC++ 11で遊んでいて、マップに値を挿入する非常に便利な方法を見つけました(順序付けられていないおよび/またはマルチマップ):
map<unsigned, string> test;
test.insert({1, "abc"});
このコードは動作していますが (GCC 4.8 または Clang 3.2 でコンパイル)、いくつか問題があります。には、insert()
基本的に 6 つの署名があり、関心のある場所にあります。
1. pair<iterator,bool> insert (const value_type& val);
2. template <class P> pair<iterator,bool> insert (P&& val);
3. void insert (initializer_list<value_type> il);
最初の 2 つはpair<const key_type,mapped_type>
型オブジェクトを受け取り、最後のものは then のリストを受け取ります。したがって、理論的には、コードは
test.insert({1, "abc"});
は、2 番目のinsert()
バージョン/署名を使用しています。ここでは、C++11 の均一な初期化を使用してペアを構築するため、このペアを として使用しlvalue
ます。これは次のように「解釈」できます。
test.insert(pair<const unsigned, string> {1, "abc"});
私たちもできることに注意してください
test.insert(pair<const unsigned, string>(1, "abc"));
また
test.insert(make_pair(1, "abc"));
しかし、最初のバージョンはより自然に見えます。このアプローチに大きな問題はありますか?リスト初期化子のバージョンと競合する可能性がありますか?