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
.
Что касается "типа", я не совсем уверен, что вы имеете в виду. Если вы имеете в виду параметризованные классы, то С++ называет это «программированием шаблонов» или «универсальным программированием». В приведенном выше примере 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()
.
person
wilhelmtell
schedule
05.01.2009