set

et的特性是,所有元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有实值(m/m)和键值,set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。

我们可以通过set的迭代器改变set的元素值吗?不行,因为set元素值就是其键值,关系到set元素的排列规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set iterators是一种constant iterators.

set拥有与list相同的某些性质:当客户端对它进行元素新增操作(insert) 或删除操作(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效。当然,被删除的那个元素的迭代器必然是个例外。

由于RB-tree是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STLset即以RB-tree为底层机制。又由于set所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的set操作行为,都只是转调用RB-tree的操作行为而已。

multiset

multiset的特性以及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的插人操作采用的是底层机制RB-tree的 insert_egual() 而非insert_unique()。

map

map的特性是,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值。

我们可以通过map的迭代器改变map的元素内容吗?如果想要修正元素的键值,答案是不行,因为map元素的键值关系到map元素的排列规则。任意改变map元素键值将会严重破坏map组织但如果想要修正元素的实值,答案是可以,因为map元素的实值并不影响map元素的排列规则。因此,map iterators既不是一种constant iterators,也不是一种 mutable iterators。

map拥有和list相同的某些性质:当客户端对它迸行元素新增操作(insert) 或删除操作 (erase) 时,操作之前的所有迭代器,在操作完成之后都依然有效.当然,被删除的那个元素的迭代器必然是个例外。

由于RB-tree是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STL map即以RB-tree为底层机制又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map操作行为,都只是转调用RB-tree的操作行为而已。

multimap

multimap的特性以及用法和map完全相同,唯一的差别在于它允许键值重复,因此它的插人操作采用的是底层机制RB-tree的 insert_egual() 而非insert_unique()。