3

私は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"));

しかし、最初のバージョンはより自然に見えます。このアプローチに大きな問題はありますか?リスト初期化子のバージョンと競合する可能性がありますか?

4

0 に答える 0