c++ - 序列容器 - 为什么只有少数序列容器支持少数表达式
问题描述
我正在通过名为要求的序列容器:https ://en.cppreference.com/w/cpp/named_req/SequenceContainer
但随后它声明以下表达式必须有效并且对名为的序列容器具有指定的效果:
例子:
seqcnt.pop_front() Destroys the first element. deque / list / forward_list
seqcnt.pop_back() Destroys the last element deque / list / vector
为什么不是所有的序列容器都支持所有的表达式?
解决方案
因为序列容器是不同的,并且具有不同的性能友好能力。
Astd::array
是定长容器;您不能从中删除元素,因为它的长度在编译时是固定的。因此不存在删除(或插入)元素的功能。
std::forward_list
,根据定义,朝着一个方向前进:从前到后。删除第一个元素很便宜;它只需要获取第一个节点,将其删除,并使第二个节点成为新的第一个节点。要删除最后一个元素,需要遍历整个列表才能到达结束迭代器之前的元素。这对性能不友好。如果你想自己做,你可以。但由于它的 O(n) 性能,该标准不会建议通过专门创建一个函数来实现这一点是一个好主意。
std::vector
是一个动态大小的数组。最后的删除是一个恒定时间的操作,因为您只是销毁最后一个元素并递减一个指针。但是一开始的移除需要将数组中剩下的所有元素向下移动一个。这对性能不友好,因此标准不会建议通过专门创建一个函数来执行此操作是一个好主意。
推荐阅读
- mongodb - React-native:添加新项目后如何自动更新主屏幕
- android - 我如何在颤动的新容器上放置单词
- python - 如何在调用者的 try/except 之前拦截被调用模块函数中的错误
- wordpress - 如何获取任何 WordPress 主题和插件的挂钩
- net-snmp - NET-SNMP 中的异步调用并不是真正的异步
- c++ - 在保留顺序函数的同时删除向量中的重复项的逻辑错误
- hyperledger-fabric - Cli 服务可以存在于安装在不同机器(Hyperledger Fabric)中的每个组织上吗?
- java - 如何模拟 IMPLY 门?
- neo4j - 由于 Neo4J 中缺少属性,连接不起作用
- amazon-web-services - S3 和 CloudFront 上的静态网站——如何隐藏网站的非产品版本