2016-05-23 2 views
4

なぜstd::mapは、次のような挿入をサポートしていません:なぜはstd ::マップは型挿入(キー&K、ヴァル&V)の挿入機能を持っていない

std::map<obj1, obj2> map_int; 

void insert_map(obj1 &key, obj2 &val) 
{ 
    map_int.insert(key, val); 
} 

私は上記が正しくないことを知っています。私はそのような挿入機能を設計することができないことを知りたい。これは、IMOペアを作成するよりも直感的です。

+0

が、これは 'マップ[キー] = val'が何をするかではないです:あなたは、目的のキーと値、例えばを含むそれをstd::pairに合格する必要がありますか? – Barmar

+2

FWIW、C++ 11では、 'map.intsert({key、val});'を使うことができます。 –

+3

@Barmarは、指定されたキーを持つ項目がある場合に値を置き換えます。指定されたキーを持つ項目がある場合、 'insert'は値を置き換えません。 –

答えて

7

それはemplace()と呼ばれています:あなたが使用できるC++ 17では

std::map<std::string, std::string> m; 

// uses pair's template constructor 
m.emplace("d", "ddd"); 
+0

もう一度ペアが必要ですか?なぜ単にそれはinsert(key、val)にできないのですか? – 0xhacker

+1

@ mc_87 'emplace(key、value)'はあなたが求めていることをしていますが、唯一の違いは関数の名前です。 –

+3

@ 0xhackerおそらく、他のすべてのSTLコンテナとの一貫性のために、挿入するために 'value_type'を使用します。汎用コードはこの一貫性の恩恵を受ける。しかし、ユースケースが十分に充実していれば、このために追加のオーバーロードが得られる可能性があります。 – chris

2

、:

map_int.try_emplace(key, val); 

これ、実際にいくつかの有用な情報を返します:

std::pair<std::map<obj1, obj2>::iterator, bool> p = map_int.try_emplace(key, val); 
  • p.firstは、指定されたキーを持つ要素を指すイテレータです。
  • p.secondは、挿入が行われたかどうかを示します。

map_int.emplace(key, val)でC++ 11でも同様の効果が得られますが、値のコピー/移動に関する微妙な違いがあります。

struct X { X(int, char, bool); }; 

std::map<int, X> m; 
m.try_emplace(10, 20, 'x', false); // constructs X(20, 'x', false) if new 

C++ 11で同様の動作が次のようになります:

m.emplace(
    std::piecewise_construct, 
    std::forward_as_tuple(10), 
    std::forward_as_tuple(20, 'x', false)); 
+0

また、C++ 17には、キーが存在する場合には古い値を上書きするか、そうでない場合にはペアを挿入する場合にも、 'std :: map :: insert_or_assign'があります。 –

0

std::mapがで、いくつかのinsert()方法(持っていますまた、try_emplaceは、任意の要素の好都合な構築を可能にします実際には)、それは単にあなたが期待しているものとは異なる署名を持っています。

std::map<obj1, obj2> map_int; 

void insert_map(obj1 &key, obj2 &val) 
{ 
    map_int.insert(std::make_pair(key, val)); 
} 
+0

私はこの作品を知っています。私が明示的に言う質問では、キーとvalだけを挿入するとペアを作成するよりも直感的です。私の質問は、なぜstl mapのデザイナー/実装者がより簡単なインターフェースを持っていないのかということでした。ペアでそれを複雑にする必要があるのはなぜですか? – 0xhacker

+1

他のコメントはすでにそれをカバーしていると思います。 'std :: map'は' std :: pair'値のコンテナであり、他のコンテナと同様に 'value_type'(この場合は' std :: pair')を使って新しい値を挿入する必要があります。標準がより単純なインターフェースを定義しない理由を知りたければ、インターフェースを設計したC++委員会に尋ねてください。 –

関連する問題