Требования к типу для std :: map - PullRequest
13 голосов
/ 23 ноября 2010

Сегодня я создал карту, где тип значения не имеет конструктора по умолчанию. Я был удивлен, что не смог использовать 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 ]

8 голосов
/ 23 ноября 2010

operator[] действительно требует конструктивности по умолчанию, потому что семантика этого метода требует, чтобы, если ключ еще не существовал, создавалась соответствующая запись. Таким образом:

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

создаст и сохранит новый объект TValue(), если foo не существует на карте, и вернет ссылку на него.

5 голосов
/ 23 ноября 2010

Этот сайт является отличной ссылкой на STL: http://www.sgi.com/tech/stl/

В основном, это говорит, что карта принимает обязательные 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, и, следовательно, Key необходимо быть сопоставимым с operator<.

Надеюсь, это поможет! Я знаю, что это немного беспричинно, и я не хочу быть снисходительным, но я просто хочу убедиться, что абсолютно ясно, как вести себя по этому поводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...