代码之家  ›  专栏  ›  技术社区  ›  BЈовић

std::map的类型要求

  •  13
  • BЈовић  · 技术社区  · 15 年前

    今天我创建了一个映射,其中的值类型没有默认构造函数。我很惊讶我不能使用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 回复  |  直到 15 年前
        1
  •  8
  •   Konrad Rudolph    15 年前

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

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

    将创建和存储新对象 TValue() 如果 foo 在映射中不存在,并返回对它的引用。

        2
  •  5
  •   blwy10    15 年前

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

    基本上,它说map take有两个强制类型参数, Key Data . 数据 必须是 Assignable ,正如丹尼尔所说。 钥匙 但是,声明需要是可以与类型一起使用的类型 Compare ,即。 指定参数为类型的函数对象 钥匙 . 在这种情况下,默认值 比较 函数对象是 std::less<T> ,这是一个 Strict Weak Ordering 比较类型对象的 T 使用 operator< . 因此,如果您不更改 比较 键入,即使用默认值, 标准::减少<T> 将与类型一起使用 钥匙 ,因此 操作员< 将与类型一起使用 钥匙 ,因此 钥匙 需要与 操作员< .

    希望能有帮助!我知道这是有点无缘无故的,我并不想居高临下,但我只想确保它是绝对清楚的,如何进行推理这件事。