STL имеет два ассоциативных контейнера: std::map<K,V> and
std :: multimap. Существует также std::set<V>
, который должен быть адаптером std::map<V,void>
, но как таковой он не является ассоциативным контейнером. Мультикарта похожа на карту, только она позволяет использовать несколько идентичных ключей в одном контейнере. И карта, и мультикарта содержат элементы типа std::pair<K,V>
. Другими словами, std::map<K,V>::value_type == std::pair<K,V>
, но std::map<K,V>::key_type == K
и std::map<K,V>::mapped_type == V
.
Что касается "Типа", я не совсем уверен, что вы имеете в виду. Если вы имеете в виду параметризованные классы, то C ++ называет это «Программирование на основе шаблонов» или «Общее программирование». В приведенном выше параметре std::map<K,V>
параметризовано по K и V для типа ключей и типа значений. C ++ также поддерживает шаблонные функции:
template<typename T>
void f(T o);
объявит функцию, которая принимает в качестве параметра любой тип вообще, включая примитивные типы. C ++ не поддерживает общее разрешение типов, так что тип T должен иметь определенную иерархию. Пока все, что вы можете сделать, это просто предположить, что переданный тип действительно имеет правильную иерархию, и компилятор будет жаловаться, если вы попытаетесь вызвать необъявленную функцию над объектом этого типа.
template<typename T>
void f(T o) {
o.do_it();
}
Выше будет работать, пока T определяет метод do_it()
.