【问题标题】:Practical summary/reference of C++11 containers/adapters properties? [closed]C++11容器/适配器属性的实用总结/参考? [关闭]
【发布时间】:2013-05-03 18:31:05
【问题描述】:

我正在寻找各种 C++11 标准容器和容器适配器(可选还包括 boost/Qt)的重要属性的全面总结/参考,但按这些属性索引而不是比通常的每个容器文档(更多内容见下文)。

我想到的属性包括:

  • 插入功能(前/后/任意)。
  • 移除功能(正面/背面/任意)。
  • 访问能力(前/后/单/双向遍历/随机访问)。
  • 上述操作的复杂性,以及迭代器失效规则。
  • 独特性?订购?联想?连续存储?提前预订?

我可能忘记了一些在这种情况下不要犹豫评论/编辑。

我们的目标是使用该文档来帮助为正确的工作选择正确的容器/适配器,而不必每次都一遍又一遍地浏览各种单独的文档(我的记忆力很差)。

理想情况下,它应该按属性和容器类型(例如类似表)进行索引,以便做出决策以及快速参考基本约束。但实际上每个属性的索引对我来说是最重要的,因为这是在文档中搜索最痛苦的。

如果没有人制作过这样的文档,我会感到非常惊讶,但是我的 Search-fu 在这方面失败了。

注意:我并不是要你总结所有这些信息(如果我真的需要的话,我会自己做,在这种情况下我会在这里发布结果)但只是如果您碰巧知道符合这些要求的现有文档。 like this 是一个好的开始,但正如您所见,由于它仅限于成员函数,因此仍然缺少我想要的许多信息。

感谢您的关注。

【问题讨论】:

  • 怀疑有没有这样的参考。也许您可以为 cppreference.com 创建一个?
  • @JoachimPileborg:是的,如果我在这里没有得到满意的答案,这可能就是我最终会做的事情。我只是想我会先问一下,以防我在研究过程中遗漏了什么(这不是第一次)。 ;)

标签: c++ c++11 documentation containers


【解决方案1】:

我不知道有哪一份文档可以提供您所需的一切,但其中大部分都已编目在某个地方。

  • 这个reference site 有一个大表,其中包含所有容器的所有成员函数
  • 这个SO question 有一个复杂性保证的大表。
  • SO question 为您提供了一个决策树,供您在容器之间进行选择。

容器成员函数的复杂度要求并不难记住,因为只有 4 个类别:(摊销)O(1)O(log N)O(N)O(N log N)(成员函数 std::list::sort()跨入标准库的算法域),因此如果您愿意,可以制作 cpp 引用容器表的 4 色编码版本。

选择正确的容器可以像使用std::vector 一样简单,除非您的分析器指示存在瓶颈。达到这一点后,您必须在空间/时间复杂度data locality、查找容易程度与插入/修改容易程度以及额外不变量(排序性、唯一性、iterator invalidation rules)之间做出艰难的权衡。

最困难的部分是您必须平衡您的容器(空间要求)与您正在使用的算法(时间要求)。容器可以保持不变量(例如 std::map 按其键排序),其他容器只能使用算法模仿(例如 std::vectorstd::sort,但没有相同的插入复杂度)。所以在你完成容器表之后,一定要对算法做类似的事情!

最后,如果不提及Boost.MultiIndex,任何容器摘要都是不完整的:因为有时您不必选择!

【讨论】:

  • 感谢 SO 的链接(我已经找到了 cppreference.com 的链接),我不知何故错过了这些,它们非常有帮助,尤其是决策树!所有这些绝对是构建我心目中的文档的很好的源材料。
  • WRT 到“达到那个点后,你必须做出艰难的权衡......” => 是的,这正是我问这个问题的原因:我有这样一个糟糕的记忆,我浪费了太多时间(IMO)搜索文档来记住每个容器的所有这些限制。因此,“摘要/一目了然”的要求。 ;)
  • @syam 一段时间后他们变得非常熟悉:) 有广泛的类别,例如序列容器(向量、数组、双端队列、列表)、关联容器(映射、集合、带/不带唯一_、带/without unordered_) 具有许多共同的成员函数。
  • Define "after a while"... 自 1995 年以来我一直在使用 C++,但对于小细节我的记忆力仍然没有任何改善,我总是不得不乏味地查找它们。也许再过 20 年,谁知道呢……(但我有点怀疑);)
  • @syam 我的意思是“经过一段时间的密集使用”。我的意思是不使用 C 风格的数组、手动内存分配或手写列表的节点指针操作。只要在有意义的地方使用 STL 容器 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2014-02-03
  • 2012-06-20
  • 2016-05-26
  • 1970-01-01
相关资源
最近更新 更多