13

今天我创建了一个映射,其中值类型没有默认构造函数。我很惊讶我无法使用 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&)
4

2 回答 2

8

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

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

TValue()如果foo地图中不存在,将创建并存储一个新对象,并返回对它的引用。

于 2010-11-23T10:26:36.280 回答
5

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

基本上,它说 map 具有强制性的 2 个类型参数,Key并且Data. Data需要Assignable,正如丹尼尔所说。Key但是,声明需要是可以与 type 一起使用的类型Compare,即Compare指定参数为 type 的函数对象Key。在这种情况下,默认Compare函数对象是std::less<T>,它是使用比较Strict Weak Ordering类型对象的a 。因此,如果您不更改类型,即使用默认值,将与 type 一起使用,因此将与 type 一起使用,因此需要与 进行比较。Toperator<Comparestd::less<T>Keyoperator<KeyKeyoperator<

Hope that helps! I know it's a bit gratuitous and I don't mean to be condescending, but I just want to make sure it's absolutely clear how to go about reasoning about this.

于 2010-11-23T10:27:18.777 回答