Требования к типу для std:: map
Сегодня я создал карту, где тип значения не имеет конструктора по умолчанию. Я был удивлен, что я не мог использовать 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;
}
Я компилирую вот так:
[[email protected] 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&)
Ответы
Ответ 1
operator[]
действительно требует конструктивности по умолчанию, поскольку семантика этого метода предусматривает, что если ключ еще не существует, создается соответствующая запись. Таким образом:
map<TKey, TValue> mymap;
TKey foo = …;
TValue& x = mymap[foo];
создаст и сохранит новый объект TValue()
, если foo
не существует на карте и возвращает ссылку на него.
Ответ 2
Этот сайт делает отличную ссылку 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<
.
Надеюсь, что это поможет! Я знаю это немного безвозмездно, и я не хочу быть снисходительным, но я просто хочу убедиться, что он абсолютно ясно, как рассуждать об этом.