list与vector都是STL中的容器,vector是表示可变大小数组的序列容器。 就像数组一样,vector采用的连续存储空间来存储元素。而list的底层结构是链表。因此连个容器的底层不同,因此他们表现也不同。我们从七个方面进行总结(详细知识点与实现):
vector | list | |
底层结构 | 动态顺序表,他是一段连续的空间, 就像数组一样,vector采用的连续存储空间来存储元素。 | 他底层的实现是一个带结点的双向链表。 |
随机访问 | 支持随机访问,访问效率为O(1)。 | 不支持随机访问,访问摸个元素的效率为O(n)。 |
插入删除 | 支持随机插入与删除,但是效率极低,时间复杂度为O(n),且一定情况下进行插入时需要扩容(扩容:开辟新空 间,拷贝元素,释放旧空间,导致效率更低)。 vector<int>::iterator支持“+”,“+=”,“<”等操作符 | 任意位置插入删除效率高,时间复杂度为O(1),且插入时不需要元素搬移。 list<int>::iterator则不支持“+”、“+=”、“<”等 |
空间利用率 | 底层空间连续,不易造成内存碎片,空间利用率高,缓存利用率高。 | 它的底层时动态开辟的,小结点容易造成内存碎片,空间利用率和缓存利用率都低。 |
迭代器 | 原生态指针。 | list的迭代器不能是原生态指针,如果是原生态指针就无法结束,因此要对原生态指针(结点指针)进行封装。 |
迭代器失效 | 当插入元素时会失效,因为插入元素可能造成重新扩容,导致原来的迭代器失效;删除时,当前迭代器需要重新赋值,否则可能会失效。 | 插入元素不会导致迭代器失效, 删除元素时,只会导致当前迭代 器失效,其他迭代器不受影响。 |
应用场景 | 需要高效存储,支持随机访问,不关心插入删除效率。 | 当进行大量插入和删除时,不关心随机访问。 |