Vector是一个动态数组。Vector中的元素可以按顺序存储,并且可以根据索引位置进行访问和修改。可以动态调整大小,可以使用push_back()函数在尾部添加元素,使用pop_back()函数删除尾部元素。允许存储重复的元素。
优点:支持随机访问,即下标访问和迭代器访问,所以查询效率高。
缺点:往头部或中部插入或删除元素时,为了保持原本的相对次序,插入或删除之后的所有元素都必须移动,所以插入效率比较低。
适用场景:适用于对象简单,变化较小,并且频繁随机访问的场景。
List: list 封装了链表,是有序的。 不过在内存中不是连续的内存存储。每一个结点都包括一个信息块、一个前驱指针、一个后驱指针。可以不分配必须的内存大小就可以方便的进行添加和删除。
- List的插入和删除操作非常高效,不需要移动其他元素。
- List允许存储重复的元素。
优点:
1. 不使用连续的内存进行存储,存储空间无限(只要内存够)。可以在任意位置插入或删除且效率高。
2. 在内部插入、删除很快(不需要进行内存拷贝或者移动,只需要进行指针的更改)
缺点:
1. 随机查找太慢
2. 相比vector 占用内存比较大
Map: 由红黑树实现,其元素都是“键值/实值”,所形成的一个对祖(key/value paris)。每个元素都有一个键,是排序准则的基础。每个键只能出现一次,不允许重复。Map内部自建一棵红黑树,这棵树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。
- Map中的元素是键值对(key-value)存储的,每个键都唯一,用于查找和访问对应的值。
- Map可以动态调整大小,可以使用insert()函数插入键值对,使用erase()函数删除指定键的元素。
- Map提供了快速的查找机制,可以使用键来获取对应的值。
- Map不允许重复的键,如果插入具有相同键的元素,后面的元素会覆盖前面的元素。
优点:使用平衡二叉树实现,便于元素查找,且能把一个值映射成另一个值。
缺点:每次插入都需要调整红黑树,效率有一定影响。
map比vector查找更快(map的内部数据结构用rb-tree实现,而用vector你只能用线性查找,效率很低,也有一种说法,关联式容器拥有自动排序能力,并不意味它们在排序方面的执行效率更高。事实上由于关联式容器每安插一个新元素,都要进行一次排序,所以速度反而不及系列容器经常采用的手法:先安插所有元素,然后调用排序算法进行一次完全排序。)
如果需要快速随机访问元素,可以选择Vector;如果需要频繁插入和删除元素,可以选择List;如果需要键值对的存储和查找,可以选择Map。