web-dev-qa-db-ja.com

マップにペアを挿入する方法

私は次のマップ構造を持っています:_map < pair < int,int >, object* >_そしてそれに挿入したいと思います。

ペアとオブジェクトを挿入しようとしているので、どうすればよいですか?ペアを作成これから?

持っているペアとオブジェクトからmake_pair()を使用して新しいペアを作成する必要がありますか?もしそうなら、これを行う方法を教えていただけますか?

12
Myx
object * myObject = // get an object somehow
myMap.insert(std::make_pair(std::make_pair(1,2), myObject));

または

typedef map<pair<int, int>, object *> MapType;
object * myObject = // get an object somehow
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject));
20
Nick Meyer

C++ 11以降を使用していると仮定すると、最善のアプローチはおそらく次のとおりです。

object * myObject = // get an object somehow
myMap.emplace({1,2}, myObject);

マップの場合、emplaceはキーと値を別々の引数として取るinsertのバージョンと考えることができます(実際には、対応するpairの引数の任意の組み合わせを取ることができます。タイプのコンストラクターが取ることができます)。構文的にクリーンであることに加えて、make_pairは通常、コンテナのmake_pairと正確に一致しないタイプの出力を生成するため、value_typeよりも効率的である可能性があります。不要な型変換が発生します。

以前はこれを推奨していましたが、これはC++ 11以降でも機能します。

object * myObject = // get an object somehow
myMap.insert({{1,2}, myObject});

これにより、わずかに意外なemplaceの使用が回避されますが、以前は、キーまたは値の型が移動専用の場合は機能しませんでした(例:unique_ptr)。これは標準で修正されていますが、標準ライブラリの実装ではまだ修正されていない可能性があります。これも理論的には少し効率が悪いかもしれませんが、中途半端なコンパイラーなら簡単に最適化できます。

11
Geoff Romer

2つの方法があります:

typedef std::map<int,Object> map_t;
map_t map;
Object obj;

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1

map[1] = obj; // 2
  1. キーがまだ存在しない場合にのみ機能し、イテレータはキー値を持つペアを指し、ブール値はキーが挿入されているかどうかを示します。

  2. 簡単ですが、オブジェクトがまだ存在しない場合は、コピーで作成するのではなく、最初にデフォルトで作成してから割り当てます。

パフォーマンスを気にする必要がない場合は、前のエントリを消去するかどうかを選択するだけです。

1
Matthieu M.