EC3-1:Choose your containers with care

本文深入解析C++标准库中的各种容器,包括vector、string、deque、list等序列容器,以及set、map等关联容器。讨论了不同容器的特性,如连续内存容器与基于节点的容器的区别,以及它们在插入、删除操作中的表现。同时,文章提供了选择合适容器的指导原则,如随机访问迭代器的选择、避免元素移动的策略等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++提供了一些容器:
标准STL序列容器:vector, string, deque, list.
标准STL关联容器:set, multiset, map, multimap.
非标准序列容器:slist, rope.
非标准关联容器:hash_set, hash_multiset, hash_map, hash_multimap.
vector<char>作为string的替代(详见EC3-13)
vector作为标准关联容器的替代(详见EC3-23)
标准非STL容器:数组, bitset, valarray, stack, queue, priority_queue.

算法复杂度很重要,但除此之外需要考虑的还有很多。

首先引入一种对容器分类的方法。
连续内存容器:把元素放在一块或多块内存中,每块有多个元素,插入或删除元素时,同块的其他元素要向前或后移动以让出空间或填充被删除元素的空隙。这会影响效率和异常安全性(见EC3-5,EC3-14)。连续内存容器有:vector, string, deque, rope。
基于节点的容器:每个内存块只有一个元素,插入删除只影响指向节点的指针,元素的值不移动。基于节点的容器有:list, slist, 所有标准关联容器, 非标准哈希容器。

需要在容器任意位置插入新元素,则选择序列容器。
关心容器中元素的排序,则避免哈希容器(反之则尽量选择复杂度较优的哈希容器)。
需要标准C++的容器,则排除了哈希容器,slist,rope。
需要随机访问迭代器,则选择在vector, deque, string,rope中。
需要双向迭代器,则避免slist。
插入或删除元素时避免原元素的移动,则选择连续内存容器。
布局和C兼容,则只能选择vector(详见EC3-16)。
需要查找速度,则选择哈希容器,排序的vector或标准关联容器。
在意引用计数,则避免string和rope。
需要回滚能力,则选择基于节点的容器。
需要迭代器,指针,引用变为无效的次数最少,则选择基于节点的容器。
迭代器是随机访问类型,没有删除且插入只在末尾时指针和引用就不会无效,需要这样的属性则选择deque。

所以,算法复杂度很重要,但不是问题的全部。

最后,在STL之外,还有更多选择,请仔细考虑所有选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值