今天我创建了一个地图,其中值类型没有默认构造函数。我很惊讶我不能使用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&)
答案 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种类型参数,Key
和Data
。丹尼尔说,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<
相比较。
希望有所帮助!我知道这有点无偿,我不是故意屈尊俯就,但我只是想确保如何去理解这个问题。