STL中的Set和Map

STL中的Set和Map 网络

先来看一段网络上的文字描述: spa

上图是一段关于STLSet集合的描述,一样的,也近似适合Map的描述。上述文字中,描述了最为重要的特征: 3d

SetMap,底层调用了红黑树的结构,而且实现的是一种自动平衡二叉搜索树。 blog

  • Set

平衡二叉搜索树(Set) 索引

如上图,STLSet实现的本质是平衡二叉搜索树,且树中没有相同的元素,每个节点表示Set中的一个元素,Set中只有键,也就是上述图中每一个节点的值,就是Set的每一个元素,所以Set中没有重复元素,当向Set中执行insert(插入)时,树会自动调整结构(对于红黑树而言,会实现节点的旋转),以保证树结构的平衡性。当执行屡次向节点中插入同一个键值时,好比insert5),insert5),则只会执行第一次的insert操做。后续的插入,并不会执行,由于Set结构的树中无重复元素。 it

另外一个点在于,Set中被插入的键不能被修改,也就是经过迭代器修改键值是不被容许的。由于键值一旦被修改,就意味着树的结构遭到了破坏,而这在最坏的状况意味着:整棵二叉树遭到了破坏,甚至须要重构整棵二叉树。即便在红黑树中,并无这样的操做。由于红黑树的最为显著的特征为:局部调整。即对于Set而言,其iterator属于const-iterator table

另一个须要被注意的点在于: 容器

咱们使用迭代器来访问容器是一件很日常的事情,上述代码是一段使用极其日常的代码,其做用是遍历Set中全部的元素。注意循环的终止条件是:!=而不是:<咱们一般习惯了小于的小法: 重构

即: 二叉树

但这样的写法是错误的。

  • Map

下面来看MapMap的结构造成机理和Set几乎是如出一辙的,而Map的结构以下:

"挂件"平衡二叉搜索树(Map

Map的结构如上图:可见,Set相比,Map只是多了一个"挂件",也就是常说的Map是由:键—值对构成的。键充当了索引,值则记录了一些其余内容。而对于Set而言,只有键。或许咱们用下面这个表来描述更为合适:

键—值对

索引序号

名字

1

张三

2

李四

3

王五

左边的索引号就是键,右边的名字就是值,因此说Map其实是一种极为广泛简单的概念。这种关系就像字典同样。

而关于Map的其余性质,和Set是极其相似的。好比:没有相同的元素,固然对于Map而言,没有相同的元素是只没有两个元素键相同。执行两个insert,仍然会只有键值对存在树中,只是第二次执行的insert会修改第一次的 -值对中的值。

一样的,Map中的键是不能被修改的,由于一样会致使"重建树"这个问题,可是很明显的是,值明显是能够修改的,就像咱们能够把上述索引序号为"3"的"王五"修改成"赵六";但咱们不能将索引号3修改成4,(咱们只能将3删除,再添加4,这是能够的)。固然是用迭代器访问时,其也只能用!=,而不是<

相关文章
相关标签/搜索