【发布时间】:2014-08-26 16:48:14
【问题描述】:
我的问题很简单:是否可以获得指向std::queue容器适配器底层存储的指针?
我正在使用 SFML 进行渲染的一些模拟,我使用 SFML 渲染目标 (sf::RenderTarget) 的 draw() 方法来绘制整组数据。该方法有一个类似 C 的接口,需要一个指向数据的指针和一个带有要绘制元素数量的 std::size_t。
由于出于某些目的将数据存储在队列中,如果有某种方法可以将该指针指向队列底层存储,而不是将数据复制到向量中,我将很高兴。
我知道std::queue默认适应容器std::deque,但我不知道那个循环缓冲区是如何实现的,它的数据是否连续(所以我可以直接提取指向数据的指针)。
编辑:性能
看看下面的答案,让我注意我使用std::deque 不是因为它花哨的类似队列的界面,而是因为我真的需要快速排队。当然我可以使用std::vector。如果性能不是这里的重点,我会使用矢量的push_back()和erase( begin() )。但我需要的是快速排队和一种将队列中的数据有效地移动到渲染目标的方法。当然,如果排队与努力抽签平衡到抽签方面,我将使用std::vector。
【问题讨论】:
-
IIRC,
std::deque没有连续存储,但通常以块的形式分配,并带有指向这些块的指针数组。 -
不,没有这样的成员,这是有原因的。默认后端容器
std::deque<>提供的存储不是标准要求的连续存储。您也提到过,实施也不是强制性的。 -
如果你好奇
std::deque<>通常是如何实现的,see this answer to a different question 是一个常见的实现。它很好地说明了为什么您使用std::deque<>后端寻求的东西根本不存在。 -
没有人注意到
std::queue只是包装了底层容器,所以它调用container.pop_front()然后就不能和std::vector一起使用了? (n.m. 很快删除了他的答案;))。如果就这么简单,我现在会使用std::vector,而且我永远不会在这里问问题(因为在这里问是我们应该做的最后一件事。当我真的不知道如何继续时,我会问这样的问题) . -
老实说,根据您为该 C API 调用缓冲的数据大小,我认为如果您真的想要,您的复制然后调用方法很可能是您的最佳选择快速排队和呼叫的连续数据。至少在我看来,您最好直接使用
deque直接删除中间人(队列适配器),并保持您的先复制后调用方法。我想,值得进行基准测试。我们在这里谈论多少数据(每份)?基于迭代器的复制(队列不提供但双端队列提供的东西)可能会有很大帮助。
标签: c++ c++11 containers c++-standard-library