C++一些STL容器(vector,set,map,queue,deque)的对比及其初始化,访问,插入,删除,修改元素方法概括

这是我引用转载“亦已歌”的文章,主要是在开发的过程中学习;
在此转载主要是为了后期能更方便的找到该博主的文章;
如有侵权,请联系我,我既可删除。
该篇文章在转载时,代码部分有乱码,如需参考,请移步至原文处;
原文链接:https://blog.csdn.net/m0_73216388/article/details/136782568

在C++的标准模板库(STL)中,不同的容器有各自独特的属性和用途。以下是一些常见STL容器的比较:

顺序容器:

  • vector: 动态数组,提供快速随机访问。适合于元素数量经常变化的情况。
  • deque: 双端队列,与vector类似,但在前端插入和删除操作更高效。
  • list: 双向链表,支持快速插入和删除,但不支持随机访问。
  • forward_list: 单向链表,与list类似,但仅支持单向顺序访问。
  • array: 固定大小数组,支持快速随机访问,但大小在编译时固定。

关联容器:

  • set: 基于红黑树的集合,元素唯一且自动排序。
  • multiset: 类似set,但允许重复元素。
  • map: 基于红黑树的键值对集合,每个键唯一。
  • multimap: 类似map,但允许键有重复。

无序关联容器:

  • unordered_set: 基于哈希表的集合,元素唯一,不自动排序。
  • unordered_multiset: 类似unordered_set,但允许重复元素。
  • unordered_map: 基于哈希表的键值对集合,每个键唯一。
  • unordered_multimap: 类似unordered_map,但允许键有重复。

容器适配器:

  • stack: 后进先出(LIFO)的容器适配器。
  • queue: 先进先出(FIFO)的容器适配器。
  • priority_queue: 元素按优先级出队的容器适配器。

每种容器都有其特定的使用场景。例如,如果需要频繁在序列中间插入和删除元素,listforward_list 可能是最佳选择。如果需要快速访问任意元素,vectorarray 可能更合适。对于需要键值对存储且有唯一键的数据,map 是一个好的选择,而当数据中键可以重复时,可以使用multimap。无序关联容器通常在元素不需要排序且插入和查找操作非常频繁时使用。

下面是一些容器插入,删除,访问,大小操作方法概览:

vector(向量):

  • 插入: push_back, insert
  • 删除: pop_back, erase
  • 访问: operator[], at, front, back
  • 大小: size, empty, resize

deque(双端队列):

  • 插入: push_back, push_front, insert
  • 删除: pop_back, pop_front, erase
  • 访问: operator[], at, front, back
  • 大小: size, empty, resize

list(列表):

  • 插入: push_back, push_front, insert
  • 删除: pop_back, pop_front, erase
  • 访问: front, back
  • 大小: size, empty

map(映射):

  • 插入: insert, emplace
  • 删除: erase
  • 访问: operator[], at, find
  • 大小: size, empty

set(集合):

  • 插入: insert, emplace
  • 删除: erase
  • 访问: find, count
  • 大小: size, empty

queue(队列):

  • 插入: push
  • 删除: pop
  • 访问: front, back
  • 大小: size, empty

stack(栈):

  • 插入: push
  • 删除: pop
  • 访问: top
  • 大小: size, empty

unordered_set(无序集合):

  • 插入: insert, emplace
  • 删除: erase
  • 访问: find, count
  • 大小: size, empty

unordered_map(无序映射):

  • 插入: insert, emplace
  • 删除: erase
  • 访问: operator[], at, find
  • 大小: size, empty

以下是C++中各种容器的初始化、赋值、访问、插入、删除和修改元素方法的对照表:

 vector(向量)

    
    
  1. #include <vector >
  2. / / 初始化
  3. std ::vector <int > v 1; / / 默认初始化
  4. std ::vector <int > v 2 = { 1, 2, 3}; / / 列表初始化
  5. std ::vector <int > v 3(v 2); / / 拷贝初始化
  6. std ::vector <int > v 4( 5, 10); / / 初始化为 5个值为 10的元素
  7. / / 赋值
  8. v 1 = { 4, 5, 6}; / / 使用初始化列表赋值
  9. v 1. assign({ 7, 8, 9}); / / 使用 assign和初始化列表赋值
  10. / / 访问
  11. int value = v 1[ 0]; / / 通过索引访问
  12. value = v 1. at( 1); / / 通过 at方法访问,如果索引越界会抛出异常
  13. int front = v 1.front(); / / 访问第一个元素
  14. int back = v 1.back(); / / 访问最后一个元素
  15. / / 插入
  16. v 1.push_back( 10); / / 在末尾插入元素
  17. v 1.insert(v 1.begin(), 11); / / 在指定位置插入元素
  18. / / 删除
  19. v 1.pop_back(); / / 删除最后一个元素
  20. v 1.erase(v 1.begin()); / / 删除迭代器指定的元素
  21. / / 修改
  22. v 1[ 0] = 12; / / 修改指定索引的元素
set(集合)

    
    
  1. #include < set >
  2. / / 初始化
  3. std :: set <int > s 1; / / 默认初始化
  4. std :: set <int > s 2 = { 1, 2, 3}; / / 列表初始化
  5. std :: set <int > s 3(s 2); / / 拷贝初始化
  6. / / 赋值
  7. s 1 = { 4, 5, 6}; / / 使用初始化列表赋值
  8. s 1.insert( 7); / / 插入单个元素
  9. / / 访问
  10. auto it = s 1.find( 4); / / 查找元素
  11. if (it ! = s 1. end()) std ::cout < < *it < < std ::endl; / / 如果找到,访问元素
  12. / / 插入
  13. s 1.insert( 8); / / 插入单个元素
  14. s 1.insert({ 9, 10}); / / 插入初始化列表
  15. / / 删除
  16. s 1.erase( 4); / / 删除指定元素
  17. s 1.erase(s 1.begin()); / / 删除迭代器指定的元素
  18. / / 修改
  19. / / set容器不支持直接修改元素,因为它会破坏集合的有序性。如果需要修改,必须先删除再插入。

map(映射)

    
    
  1. #include <map >
  2. / / 初始化
  3. std ::map <int, std :: string > m 1; / / 默认初始化
  4. std ::map <int, std :: string > m 2 = {{ 1, "a"}, { 2, "b"}}; / / 列表初始化
  5. std ::map <int, std :: string > m 3(m 2); / / 拷贝初始化
  6. std ::map <int, std :: string > m 4(std ::make_pair( 1, "a")); / / 使用make_pair初始化
  7. / / 赋值
  8. m 1[ 1] = "a"; / / 直接赋值
  9. m 1.insert(std ::make_pair( 2, "b")); / / 插入pair
  10. m 1.insert({{ 3, "c"}, { 4, "d"}}); / / 插入初始化列表
  11. / / 访问
  12. std :: string value = m 1[ 1]; / / 通过键访问
  13. auto it = m 1.find( 2); / / 查找元素
  14. if (it ! = m 1. end()) value = it- >second; / / 通过迭代器访问
  15. / / 插入
  16. m 1[ 5] = "e"; / / 插入新元素
  17. m 1.insert(std ::make_pair( 6, "f")); / / 插入pair
  18. / / 删除
  19. m 1.erase( 1); / / 通过键删除
  20. m 1.erase(m 1.begin()); / / 通过迭代器删除
  21. / / 修改
  22. m 1[ 1] = "new value"; / / 修改元素的值

list(列表)

    
    
  1. #include <list >
  2. / / 初始化
  3. std ::list <int > l 1; / / 默认初始化
  4. std ::list <int > l 2 = { 1, 2, 3, 4}; / / 列表初始化
  5. std ::list <int > l 3(l 2); / / 拷贝初始化
  6. / / 赋值
  7. l 1 = { 5, 6, 7, 8}; / / 使用初始化列表赋值
  8. l 1. assign({ 9, 10, 11, 12}); / / 使用 assign和初始化列表赋值
  9. / / 访问
  10. int front = l 1.front(); / / 访问第一个元素
  11. int back = l 1.back(); / / 访问最后一个元素
  12. / / 插入
  13. l 1.push_front( 0); / / 在前端插入元素
  14. l 1.push_back( 13); / / 在后端插入元素
  15. auto it = l 1.begin();
  16. advance(it, 2);
  17. l 1.insert(it, 14); / / 在迭代器指定位置插入元素
  18. / / 删除
  19. l 1.pop_front(); / / 删除第一个元素
  20. l 1.pop_back(); / / 删除最后一个元素
  21. l 1.erase(l 1.begin()); / / 删除迭代器指定的元素
  22. / / 修改
  23. *it = 15; / / 修改迭代器指定元素的值
queue(队列)

    
    
  1. #include <queue >
  2. / / 初始化
  3. std ::queue <int > q 1; / / 默认初始化
  4. std ::queue <int > q 2(std ::deque <int >{ 1, 2, 3}); / / 使用deque初始化
  5. / / 访问
  6. int front = q 1.front(); / / 访问第一个元素
  7. int back = q 1.back(); / / 访问最后一个元素
  8. / / 插入
  9. q 1.push( 4); / / 在末尾插入元素
  10. / / 删除
  11. q 1.pop(); / / 删除第一个元素
  12. / / 大小
  13. size_t size = q 1. size(); / / 获取队列中元素个数
  14. bool empty = q 1.empty(); / / 判断队列是否为空
  15. / / 修改
  16. / / queue不提供直接修改元素的方法,因为它遵循先进先出的原则。

deque(双端队列)

    
    
  1. #include <deque >
  2. / / 初始化
  3. std ::deque <int > d 1; / / 默认初始化
  4. std ::deque <int > d 2 = { 1, 2, 3}; / / 列表初始化
  5. std ::deque <int > d 3( 5, 10); / / 初始化为 5个值为 10的元素
  6. / / 赋值
  7. d 1 = { 4, 5, 6}; / / 使用初始化列表赋值
  8. d 1. assign({ 7, 8, 9}); / / 使用 assign和初始化列表赋值
  9. / / 访问
  10. int front = d 1.front(); / / 访问第一个元素
  11. int back = d 1.back(); / / 访问最后一个元素
  12. int value = d 1[ 0]; / / 通过索引访问
  13. value = d 1. at( 1); / / 通过 at方法访问,如果索引越界会抛出异常
  14. / / 插入
  15. d 1.push_back( 10); / / 在末尾插入元素
  16. d 1.push_front( 11); / / 在前端插入元素
  17. d 1.insert(d 1.begin() + 1, 12); / / 在指定位置插入元素
  18. / / 删除
  19. d 1.pop_back(); / / 删除最后一个元素
  20. d 1.pop_front(); / / 删除第一个元素
  21. d 1.erase(d 1.begin()); / / 删除迭代器指定的元素
  22. / / 修改
  23. d 1[ 0] = 13; / / 修改指定索引的元素
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览 60858 人正在系统学习中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值