最近在学习STL,在前期分析了vector和list的源码,印象很深,感觉对自己以后的代码之路产生了很多改变,今天,介绍下STL当中的几个关联式容器。本博客所有论述的都为SGI版本的STL。
1.什么是关联式容器
关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么。
关联式容器分为set(集合)和map(映射表)两大类,还有拓展的multiset(多键集合)和multimap(多键映射表)。这些容器的底层实现都是使用了红黑树来实现的。
另外,STL还提供了hash_table(散列表),hash_set(散列集合),hash_map(散列映射表),hash_multiset(散列多键集合),hash_multimap(散列多键映射表)。这些都是利用hash表实现的。
总共9个容器。
另外来说,在C++11当中,新的标准重新定义了4个无序的关联式容器,就是unordered_map,unordered_set,unordered_multiset,unordered_multimap,
所以在介绍容器之前你首先应该有红黑树的知识,不熟悉可以翻一下前面的博客,对平衡树方面都有论述!
2.set
我们首先来看set,重点来熟悉一下set的接口。
这些接口当中,很多我们使用很简单,比如像是关于容量的接口。
在这我们说下insert。
pair<iterator,bool> insert ( const value_type& x );
iterator insert ( iterator position, const value_type& x );
template <class InputIterator>
void insert ( InputIterator first, InputIterator last );
这里面的pair就是一个key-value的结构体。这个结构体的定义是这样的:
template<typename K,typename V>
struct pair
{
K first;
V value;
}
在这里因为value是不存在的。所以返回以后的first就是迭代器,value就是bool类型。
我们可以通过测试:
std::set<int> num;
cout << num.empty() << endl;
num.insert(1);
num.insert(5);
pair<set<