STL容器

STL容器类型

  • 序列式容器
    vector,list(双向链表),deque,stack,queue,heap,priority_queue,slist(单向链表)。
  • 关联容器:set,map,multiset,multimap,hashtable,hash_set,hash_map,hash_multiset,hash_multimap。

STL内存分配器

  • allocate:内存分配,仅分配内存,不构造对象。
  • deallocate:内存释放, 仅释放内存,不析构对象。
  • construct:在已分配的内存空间中构造对象,仅构造对象。不分配内存。
  • destroy:在已分配的内存空间中析构已构造的对象,仅析构对象,不释放内存。
  • 调用顺序:allocate->construct->destroy->deallocate。

STL 序列式容器

vector

vector是一种动态的数组的结构,在内存中具有连续的存储空间,支持随机访问。vector是动态的空间,随着元素的加入,它的内部的机制会自行扩充空间以容纳新的元素。

使用vector时的注意点

  • vector支持随机存取。
  • 在末端的插入和删除的操作性能很好,但是在前端或中部安插或删除元素,性能就不行了,因为操作点之后的每一个元素都必须向后移动,而每一次移动都得调用assignment(赋值)操作符。
  • 不适合的vector大小会引起内存的重新的分配。
    1. 一旦内存重新配置,vector元素相关的所有references,pointers,iterators都会失效。
    2. 内存重新配置很耗时间。
  • 发生以下情况会使vector迭代器失效
    1. 使用者在一个较小索引位置上安插或移除元素。
    2. 由于容量变化而引起重新分配

解释:安插和移除元素,都会使“作用点”之后的各元素的references,pointers,iterators失效,如果安插操作甚至引发内存重新分配,那么该容器身上的所有元素references,pointers,iterators都会失效。

面试问题

  1. 频繁对vector调用push_back()对性能的影响和原因?
    频繁的调用push_back(),当vector数据结构中的迭代器finish(目前使用的空间的尾)与end_of_storage(目前可用的空间的尾)相等时,会引发空间的重新配置。
  2. vector重新分配内存的大小与方式?
    重新的空间的分配并不是在原空间的之后接续新空间,而是以2倍的大小另外配置新的空间,然后将原有的内容拷贝过来,然后才开始在新的内容之后构造新的元素,并释放原空间。因此,对vector的任何操作,一旦引起了空间的分配,指向原vector的所有的迭代器就都失效了。

你可能感兴趣的:(STL容器)