map
map特性是,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key).pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值。不能随意修改元素键值,因为map元素的键值关系到map元素的排列规则。任意改变map元素键值会严重破坏map组织。但是可以修改元素的实值。因为map元素的实值并不影响map元素的排列规则。允许用户通过迭代器修改元素的实值。
map所开放的各种操作接口,都是以RB-tree为底层机制。
set
set特性是,所有元素都会根据元素的键值自动被排序,set元素不像map那样可以同时拥有实值(value)和键值(key)。set元素键值就是实值,实值就是键值。set不允许两个元素有相同的键值。不可以通过set的迭代器改变set的元素值。因为set元素值就是键值,关系到set元素的排列规则。若改变set元素值,会严重破坏set组织。set ::iterator被定义为底层RB-tree的const_iterator(常量迭代器),杜绝写入操作。set和list性质相同,当客户端对他进行元素新增(insert)或者删除操作(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效,当然,被删除的元素迭代器例外。set 所开放的各种操作接口,也是以RB-tree为底层机制。插入操作set是使用的RB-tree的insert_unique而不是insert_equal,因为multiset才使用RB-tree的inset_equal 。
multiset - multiset的特性以及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal而不是insert_unique。