序列容器 - 为啥所有容器都没有所有方法
Posted
技术标签:
【中文标题】序列容器 - 为啥所有容器都没有所有方法【英文标题】:Sequence containers - why all containers do not all methods序列容器 - 为什么所有容器都没有所有方法 【发布时间】:2020-07-23 08:35:44 【问题描述】:我通过参考以下信息来学习 C++ 序列容器 - https://en.cppreference.com/w/cpp/container [Member function table - functions present in C++03 ,- functions present since C++11, - functions present since C++17, - functions present since C++20]
可在页面末尾找到。
我无法理解为什么所有序列容器至少支持所有基本方法,例如:
forward_list does not supports size()
vectors does not support emplace_front()
arrays does not support capacity()
deque does not supports reserve()
list does not supports emplace_hint()
同样还有其他所有可用的功能?基本上是什么特性或功能决定了哪种方法可用于一个容器而不是其他容器?
【问题讨论】:
emplace_hint
会在列表中做什么?
我不清楚这个问题,因为您似乎暗示“不支持”是可能的。我认为他们不是,其中一些“显然”。因此,请添加有关您为什么/如何认为它们可以为相关容器实施的信息。或者您是否在询问它们无法实施的原因?那么你应该在问题中澄清这一点。
"Container" 在这个上下文中只是一个描述包含某些东西的结构的词。没有“容器”接口。每个结构都有自己的方法。
【参考方案1】:
forward_list 不支持 size()
std::forward_list 旨在最大程度地提高空间效率,因此不会将大小保留为额外成员(它位于 std::list 中)。要确定大小,必须遍历列表,O(N)。
向量不支持 emplace_front()
要在前面插入,std::vector 首先需要移动现有内容。再次,O(N)。这就是 std::dequeue 发挥作用的地方。
数组不支持容量()
std::array 的大小是固定的,capacity() 没有意义,充其量只是 size() 的复制。
deque 不支持reserve()
为 std::deque 保留没有意义,因为它不使用连续存储。
list 不支持 emplace_hint()
在 std::list 上没有 emplace_hint() 的用例,您可以简单地使用 emplace()。
【讨论】:
"std::forward_list 是为最大化空间效率而设计的,因此大小不会作为额外成员保留(它在 std::list 中)。" 大小不缺少空间效率;这是为了插入效率。如果没有大小,迭代器范围的splice
函数可能只是几个指针。如果有大小,该函数必须遍历该范围才能确定添加了多少元素。没有大小,O(n) 插入变成 O(1) 插入。
@NicolBolas 你有这方面的资料吗? std::list 同时提供size()
和splice()
,因此在splice()
中具有O(n) 复杂度;因为 C++11 size()
必须是 O(1)。我为std::forward_list::splice_after()
找到的文档也说明了我觉得好奇的 O(n)。
...这很奇怪。 O(n) splice_after 没有意义,尤其是在拼接整个列表时。拼接一个范围需要在first
之前获取迭代器,但这与被拼接的元素数量不同n
。以上是关于序列容器 - 为啥所有容器都没有所有方法的主要内容,如果未能解决你的问题,请参考以下文章