6

C++ 11 と gcc-4.7.0 を使用しています。STL ソリューションを探しています。

キーとして短い文字列を持つ myClass のオブジェクトを含む、並べ替えられていないマルチマップが必要です。Emplace は、オブジェクトを構築するときにオブジェクトをマップに配置するための良い方法のように見えますが、それができるかどうか、またはキー/オブジェクトのペアのみを構築するかどうかはわかりません。これは有効である必要があります:

table.emplace(myKey, myClass(arg1, arg2, arg3));

しかし、次のことを行う方が効率的であり、有効なコードでさえありますか?

table.emplace(myKey, arg1, arg2, arg3);
4

1 に答える 1

9

これによると、gcc-4.7完全にはサポートされませんemplace()

gcc-4.8を完全にサポートしemplace()ますが、少し異なる構文が必要になります。

table.emplace(std::piecewise_construct, std::forward_as_tuple(myKey), std::forward_as_tuple(arg1, arg2, arg3));

それ以外の

table.emplace(myKey, arg1, arg2, arg3); // Does not work.

forward右辺値を有効にするstd::move()には、引数をラップするために使用できます。

したがって、コンテナ内のキーと値の両方を直接構築します。

std::piecewise_constructコンストラクターの特別な使用法のための引数std::pairです。コンストラクターに、引数を個別に基礎となるコンストラクターに転送するように要求します。

これは、実際にはemplace()連想コンテナの問題です。本来の意図は、質問で説明されているように、キーに最初の引数を使用し、値に次の引数を使用することです。この問題の詳細については、こちらを参照してください

問題を指摘してくれた Zeta に感謝しforwardます。

于 2014-03-23T02:16:15.380 に答える