输入std :: map的要求

时间:2010-11-23 10:12:17

标签: c++ stl language-lawyer

今天我创建了一个地图,其中值类型没有默认构造函数。我很惊讶我不能使用operator []将元素插入到这个地图中,但我不得不使用insert方法。

那么,对于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;
}

我正在编译:

[vladimir@sandbox 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&)

2 个答案:

答案 0 :(得分:8)

operator[]确实需要默认构造性,因为此方法的语义要求如果密钥尚不存在,则会创建适当的条目。因此:

map<TKey, TValue> mymap;
TKey foo = …;
TValue& x = mymap[foo];
如果地图中不存在TValue()

将创建并存储新对象foo,并返回对它的引用。

答案 1 :(得分:5)

此网站提供了很好的STL参考:http://www.sgi.com/tech/stl/

基本上,它表示map take具有强制性的2种类型参数,KeyData。丹尼尔说,Data需要Assignable。但是,Key声称需要是可以与Compare类型一起使用的类型,即Compare指定参数类型为Key的函数对象。在这种情况下,默认的Compare函数对象是std::less<T>,它是Strict Weak Ordering,使用T比较operator<类型的对象。因此,如果您不更改Compare类型,即使用默认值,则std::less<T>将与Key类型一起使用,因此operator<将与Key类型一起使用1}},因此Key需要与operator<相比较。

希望有所帮助!我知道这有点无偿,我不是故意屈尊俯就,但我只是想确保如何去理解这个问题。