总结一下c++的STL容器各个容器的特点和常用方法

序列容器

1. std::vector

  • 特点
    • 动态数组,支持随机访问,可通过下标直接访问元素,访问效率高(时间复杂度为 \(O(1)\))。
    • 内存是连续分配的,在尾部插入和删除元素的效率较高(平均时间复杂度为 \(O(1)\)),但在中间或头部插入和删除元素时,需要移动大量元素,效率较低(时间复杂度为 \(O(n)\))。
    • 会自动管理内存,当容量不足时会自动重新分配更大的内存空间,并将原有元素复制过去。
  • 常用方法
    • push_back():在容器尾部添加一个元素。
    • pop_back():移除容器尾部的元素。
    • insert():在指定位置插入一个或多个元素。
    • erase():移除指定位置或指定范围的元素。
    • size():返回容器中元素的数量。
    • capacity():返回容器当前的容量。
    • reserve():为容器预留指定大小的容量。
    • resize():改变容器的大小。
    • operator[]:通过下标访问元素。
2. std::deque

  • 特点
    • 双端队列,支持随机访问,访问效率为 \(O(1)\)。
    • 可以在头部和尾部高效地插入和删除元素(时间复杂度为 \(O(1)\)),在中间插入和删除元素的效率相对较低(时间复杂度为 \(O(n)\))。
    • 内存不是连续的,但比 std::vector 在头部插入和删除元素更高效。
  • 常用方法
    • push_front():在容器头部添加一个元素。
    • pop_front():移除容器头部的元素。
    • push_back():在容器尾部添加一个元素。
    • pop_back():移除容器尾部的元素。
    • insert():在指定位置插入一个或多个元素。
    • erase():移除指定位置或指定范围的元素。
    • size():返回容器中元素的数量。
    • operator[]:通过下标访问元素。
3. std::list

  • 特点
    • 双向链表,不支持随机访问,访问元素需要从头或尾开始遍历,时间复杂度为 \(O(n)\)。
    • 在任意位置插入和删除元素的效率都很高(时间复杂度为 \(O(1)\)),因为只需要修改指针。
    • 内存是不连续的,每个元素包含指向前一个和后一个元素的指针。
  • 常用方法
    • push_front():在容器头部添加一个元素。
    • pop_front():移除容器头部的元素。
    • push_back():在容器尾部添加一个元素。
    • pop_back():移除容器尾部的元素。
    • insert():在指定位置插入一个或多个元素。
    • erase():移除指定位置或指定范围的元素。
    • size():返回容器中元素的数量。
    • front():返回容器头部的元素。
    • back():返回容器尾部的元素。
4. std::forward_list

  • 特点
    • 单向链表,只支持单向遍历,不支持随机访问,访问元素需要从头开始遍历,时间复杂度为 \(O(n)\)。
    • 在任意位置插入和删除元素的效率较高(时间复杂度为 \(O(1)\)),但插入和删除操作需要知道前一个元素的位置。
    • 相比于 std::list,它占用的内存更少,因为只包含指向下一个元素的指针。
  • 常用方法
    • push_front():在容器头部添加一个元素。
    • pop_front():移除容器头部的元素。
    • insert_after():在指定位置之后插入一个或多个元素。
    • erase_after():移除指定位置之后的元素。
    • before_begin():返回指向第一个元素之前位置的迭代器。
    • front():返回容器头部的元素。

关联容器

1. std::set

  • 特点
    • 集合,存储唯一的元素,元素会自动按照升序排序(默认使用 std::less 比较函数)。
    • 插入、删除和查找元素的时间复杂度为 \(O(log n)\),因为它基于红黑树实现。
    • 不支持通过下标访问元素,只能通过迭代器遍历。
  • 常用方法
    • insert():插入一个元素。
    • erase():移除指定元素。
    • find():查找指定元素,若找到则返回指向该元素的迭代器,否则返回 end()
    • count():返回指定元素的数量(对于 std::set,结果只能是 0 或 1)。
    • size():返回容器中元素的数量。
2. std::multiset

  • 特点
    • 多重集合,允许存储重复的元素,元素会自动按照升序排序(默认使用 std::less 比较函数)。
    • 插入、删除和查找元素的时间复杂度为 \(O(log n)\),基于红黑树实现。
    • 不支持通过下标访问元素,只能通过迭代器遍历。
  • 常用方法
    • insert():插入一个元素。
    • erase():移除指定元素。
    • find():查找指定元素,若找到则返回指向该元素的迭代器,否则返回 end()
    • count():返回指定元素的数量。
    • size():返回容器中元素的数量。
3. std::map

  • 特点
    • 映射,存储键值对,每个键是唯一的,元素会根据键自动按照升序排序(默认使用 std::less 比较函数)。
    • 插入、删除和查找元素的时间复杂度为 \(O(log n)\),基于红黑树实现。
    • 可以通过键来访问对应的值,使用 operator[] 或 at() 方法。
  • 常用方法
    • insert():插入一个键值对。
    • erase():移除指定键的元素。
    • find():查找指定键的元素,若找到则返回指向该元素的迭代器,否则返回 end()
    • count():返回指定键的元素数量(对于 std::map,结果只能是 0 或 1)。
    • operator[]:通过键访问对应的值,如果键不存在,则会插入一个新的键值对。
    • at():通过键访问对应的值,如果键不存在,则会抛出 std::out_of_range 异常。
    • size():返回容器中元素的数量。
4. std::multimap

  • 特点
    • 多重映射,允许存储重复键的键值对,元素会根据键自动按照升序排序(默认使用 std::less 比较函数)。
    • 插入、删除和查找元素的时间复杂度为 \(O(log n)\),基于红黑树实现。
    • 可以通过键来查找对应的值,但不能使用 operator[] 方法,因为键可能不唯一。
  • 常用方法
    • insert():插入一个键值对。
    • erase():移除指定键的元素。
    • find():查找指定键的元素,若找到则返回指向该元素的迭代器,否则返回 end()
    • count():返回指定键的元素数量。
    • size():返回容器中元素的数量。

无序关联容器

1. std::unordered_set

  • 特点
    • 无序集合,存储唯一的元素,元素不会自动排序,而是根据哈希值存储在哈希表中。
    • 插入、删除和查找元素的平均时间复杂度为 \(O(1)\),但在最坏情况下可能达到 \(O(n)\)。
    • 不支持通过下标访问元素,只能通过迭代器遍历。
  • 常用方法
    • insert():插入一个元素。
    • erase():移除指定元素。
    • find():查找指定元素,若找到则返回指向该元素的迭代器,否则返回 end()
    • count():返回指定元素的数量(对于 std::unordered_set,结果只能是 0 或 1)。
    • size():返回容器中元素的数量。
2. std::unordered_multiset

  • 特点
    • 无序多重集合,允许存储重复的元素,元素不会自动排序,而是根据哈希值存储在哈希表中。
    • 插入、删除和查找元素的平均时间复杂度为 \(O(1)\),但在最坏情况下可能达到 \(O(n)\)。
    • 不支持通过下标访问元素,只能通过迭代器遍历。
  • 常用方法
    • insert():插入一个元素。
    • erase():移除指定元素。
    • find():查找指定元素,若找到则返回指向该元素的迭代器,否则返回 end()
    • count():返回指定元素的数量。
    • size():返回容器中元素的数量。
3. std::unordered_map

  • 特点
    • 无序映射,存储键值对,每个键是唯一的,元素不会自动排序,而是根据键的哈希值存储在哈希表中。
    • 插入、删除和查找元素的平均时间复杂度为 \(O(1)\),但在最坏情况下可能达到 \(O(n)\)。
    • 可以通过键来访问对应的值,使用 operator[] 或 at() 方法。
  • 常用方法
    • insert():插入一个键值对。
    • erase():移除指定键的元素。
    • find():查找指定键的元素,若找到则返回指向该元素的迭代器,否则返回 end()
    • count():返回指定键的元素数量(对于 std::unordered_map,结果只能是 0 或 1)。
    • operator[]:通过键访问对应的值,如果键不存在,则会插入一个新的键值对。
    • at():通过键访问对应的值,如果键不存在,则会抛出 std::out_of_range 异常。
    • size():返回容器中元素的数量。
4. std::unordered_multimap

  • 特点
    • 无序多重映射,允许存储重复键的键值对,元素不会自动排序,而是根据键的哈希值存储在哈希表中。
    • 插入、删除和查找元素的平均时间复杂度为 \(O(1)\),但在最坏情况下可能达到 \(O(n)\)。
    • 可以通过键来查找对应的值,但不能使用 operator[] 方法,因为键可能不唯一。
  • 常用方法
    • insert():插入一个键值对。
    • erase():移除指定键的元素。
    • find():查找指定键的元素,若找到则返回指向该元素的迭代器,否则返回 end()
    • count():返回指定键的元素数量。
    • size():返回容器中元素的数量。

容器适配器

1. std::stack

  • 特点
    • 栈,遵循后进先出(LIFO)的原则。
    • 基于其他容器(默认是 std::deque)实现,提供了栈的基本操作。
  • 常用方法
    • push():将元素压入栈顶。
    • pop():移除栈顶的元素。
    • top():返回栈顶的元素。
    • empty():判断栈是否为空。
    • size():返回栈中元素的数量。
2. std::queue

  • 特点
    • 队列,遵循先进先出(FIFO)的原则。
    • 基于其他容器(默认是 std::deque)实现,提供了队列的基本操作。
  • 常用方法
    • push():将元素插入队列尾部。
    • pop():移除队列头部的元素。
    • front():返回队列头部的元素。
    • back():返回队列尾部的元素。
    • empty():判断队列是否为空。
    • size():返回队列中元素的数量。
3. std::priority_queue

  • 特点
    • 优先队列,元素按照优先级排序,优先级最高的元素总是位于队列头部。
    • 基于堆(通常是最大堆)实现,默认使用 std::less 比较函数。
  • 常用方法
    • push():将元素插入队列,并根据优先级调整堆结构。
    • pop():移除队列头部(优先级最高)的元素。
    • top():返回队列头部(优先级最高)的元素。
    • empty():判断队列是否为空。
    • size():返回队列中元素的数量。

你可能感兴趣的:(c++,开发语言)