2010-11-23 8 views
13

今日、値の型にデフォルトコンストラクタがないマップを作成しました。私は、このマップに要素を挿入するために演算子[]を使用できないことに驚きましたが、挿入メソッドを使用する必要がありました。std :: mapのタイプ要件

したがって、std :: mapのキーと値の型はどのような要件ですか?ここで

は短い例です:

#include <map> 

struct A 
{ 
    A(int){} 
}; 

int main() 
{ 
    std::map< int, A > m; 
    A a1(2); 
    A a2(3); 
    A a3(4); 
    m[5] = a1; 
    m[3] = a2; 
    m[2] = a3; 
} 

私はこのようにコンパイルしています:

[[email protected] tmp]$ g++ b5.cpp -Wall -Wextra -ansi -pedantic 
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stl_map.h: In member function ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = A, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, A> >]’: 
b5.cpp:14: instantiated from here 
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stl_map.h:419: error: no matching function for call to ‘A::A()’ 
b5.cpp:5: note: candidates are: A::A(int) 
b5.cpp:4: note:     A::A(const A&) 

答えて

8

operator[]は確かにキーがない場合に、この方法の任務のセマンティクスため、デフォルト-constructibilityを必要としませんまだ存在していれば、適切なエントリが作成されます。したがって:

map<TKey, TValue> mymap; 
TKey foo = …; 
TValue& x = mymap[foo]; 

が作成しTValue()foo場合は、マップ内に存在しない新しいオブジェクトを格納し、それへの参照を返します。 http://www.sgi.com/tech/stl/

基本的には、マップは、必須2型引数を持つKeyDataを取ることを言う:

5

このサイトでは、偉大なSTLのリファレンスを作ります。ダニエルが言ったようにDataAssignableである必要があります。しかし、Compareで使用できるタイプである必要があり、すなわちCompareは、タイプがKeyの関数オブジェクトを指定するタイプである必要があると述べられています。この場合、デフォルトのCompare関数オブジェクトはstd::less<T>です。これはoperator<を使用するTのオブジェクトを比較するStrict Weak Orderingです。したがって、あなたはすなわち、デフォルトを使用し、Compare種類を変更しない場合は、std::less<T>はタイプKeyで使用されるため、operator<はタイプKeyで使用されるため、Keyoperator<と同等であることが必要です。

希望に役立ちます!私はそれがちょっと無礼だと私は謙虚になることを意味するわけではないが、私はちょうどこれについて推論する方法を絶対に明確にしたいと思う。

+2

原則として素晴らしい答えですが、OPのコードが失敗した理由を説明していません。 –

+0

@Konrad Ah、それは彼がエラーメッセージを投稿する前に私が答えたからです。その時点で彼が投稿したのは、ちょうどうまくいかなかったということでした。 – blwy10

関連する問題