首页 > 解决方案 > 序列容器 - 为什么只有少数序列容器支持少数表达式

问题描述

我正在通过名为要求的序列容器: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

为什么不是所有的序列容器都支持所有的表达式?

标签: c++c++11

解决方案


因为序列容器是不同的,并且具有不同的性能友好能力。

Astd::array是定长容器;您不能从中删除元素,因为它的长度在编译时是固定的。因此不存在删除(或插入)元素的功能。

std::forward_list,根据定义,朝着一个方向前进:从前到后。删除第一个元素很便宜;它只需要获取第一个节点,将其删除,并使第二个节点成为新的第一个节点。要删除最后一个元素,需要遍历整个列表才能到达结束迭代器之前的元素。这对性能不友好。如果你想自己做,你可以。但由于它的 O(n) 性能,该标准不会建议通过专门创建一个函数来实现这一点是一个好主意。

std::vector是一个动态大小的数组。最后的删除是一个恒定时间的操作,因为您只是销毁最后一个元素并递减一个指针。但是一开始的移除需要将数组中剩下的所有元素向下移动一个。这对性能不友好,因此标准不会建议通过专门创建一个函数来执行此操作是一个好主意。


推荐阅读