【发布时间】:2014-08-03 15:57:35
【问题描述】:
到目前为止,我还没有了解std::deque 是如何在后台实现的,并且发现它类似于指向 n 字节数组的指针数组,数据实际存储在其中。所以现在我有几个与双端队列相关的问题。
一张描述我目前对其结构了解的图片:
问题是:
当正在执行
push_front操作并且数据块 0 中没有可用空间时,会在堆上分配一个新数据块,并将指向此新分配内存的指针插入到“映射”数组中,如在普通数组中——在 O(number_of_blocks) 时间内,是吗?如何分类这头野兽?无法想象比将所有数据复制到数组中更好的方法,对其进行排序,然后将其放回原处。但是这种方法需要 O(n) 辅助内存……但是!
std::sort为std::vector和std::deque的排序提供了类似的接口。不同数据结构的不同算法是如何实现的?使用模板专业化?如果是这样,为什么不能使用std::sort对std::list进行排序? 或者,也许std::sort不关心这个容器的内部结构,只使用迭代器和方法,它们在std::vector和std::deque中是相似的(比如operator[]、size()等)?这个想法听起来很合理,也是对“为什么不能std::sort排序std::list?”的回答。变得明显。如何选择数据块的大小?您会说“它取决于实现”,但请详细说明不同的实现和解决方案背后的动机。
这里需要澄清。 谢谢。
【问题讨论】:
-
它们背后的数学无法承受,
std::deque具有随机访问迭代器,因此任何就地排序算法都能够使用该功能对数据进行排序,而不需要 O(N)额外的存储空间。std::list不提供随机访问迭代,因此不是std::sort-able。 (但是,std::list::sort-able)。请参阅the documentation ofstd::sort的类型要求部分。 -
您缺少 STL 的容器 算法方案。排序与任何其他具有随机访问迭代器的容器相同。
-
std::sort适用于任何对随机访问迭代器。std::vector和std::deque都提供随机访问迭代器,但std::list不提供。没有(必然)任何模板专业化魔法或任何东西,因为std::sort通过交换提供的范围内的元素来工作;这不需要大量额外的存储空间,也不需要容器/范围/迭代器背后的任何特殊知识。
标签: c++ sorting vector stl deque