一、vector结构上的优点:
由于底层结构是一块连续的空间,所以可以支持下标''[]''随机访问的形式。
cpu高速缓存命中率高。
尾插尾删除效率高,相比list
二、vector结构上的缺点:
越靠近头部位置的插入、删除效率低。
扩容有消耗,存在一定的空间的浪费,无论是手动扩还是自动扩,一般来说扩二倍比较合适。
三、list结构上的优点:
任何位置的插入删除的效率比较高,相比list。
按需申请释放节点,空间利用率高,不存在扩容操作。
四、list结构上的缺点:
不支持下标随机访问。
cpu高速缓存命中率低。
五、使用场景:
若存在大量的中间插入删除,考虑用list;否则用vector。list与vector互补配合。
六、迭代器失效(导致迭代器底层指针所指向的空间被销毁,而使用一块被释放的空间)场景:
string:涉及到复制(assgin)、插入(insert)、尾插(push_back)、resize(改变容器大小)、resever(扩容)、erase(删除,特别是尾删)等以上操作,都有可能会导致string扩容,也就是说string底层原来旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。
解决方式:在以上操作完成之后,如果想要继续通过迭代器操作string中的元素,只需给it重新赋值 即可。
string虽然也有失效,但是只有小部分不常用的接口使用的迭代器,其余大多数常用接口设计的是下标(size_t pos)。一般不关注string的迭代器失效。
vector:涉及到复制(assgin)、插入(insert)、尾插(push_back)、resize(改变容器大小)、resever(扩容)、erase(删除,特别是尾删)等以上操作,都有可能会导致vector扩容,也就是说vector底层原来旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。
解决方式:在以上操作完成之后,如果想要继续通过迭代器操作vecor中的元素,只需给it重新赋值 即可。
list:有且仅有erase