2010-04-12 131 views
9

我的应用程序的一部分涉及渲染音频波形。用户将能够放大/缩小波形。从完全缩小开始,我只想在必要的内部对音频进行采样,以给定分辨率绘制波形。然后,当它们放大时,异步重新采样“缺失点”并提供更清晰的波形。 (认为​​谷歌地图。)我不确定用于Qt世界的最佳数据结构。理想情况下,我想存储按时间排序的数据样本,但可以根据需要填写点数。什么Qt容器类用于排序列表?

因此,例如,数据点最初可能是这样的:

data[0 ms] = 10 
data[10 ms] = 32 
data[20 ms] = 21 
... 

但是,当他们放大,我会在必要时获得更多的积分,也许是:

data[0 ms] = 10 
data[2 ms] = 11 
data[4 ms] = 18 
data[6 ms] = 30 
data[10 ms] = 32 
data[20 ms] = 21 
... 

注意,括号中的值是查找值(毫秒),而不是数组索引。

我应该能够有效地查询范围(“所有点在10和30毫秒之间”)并且有效地插入新点。

在.net中我可能使用了一个SortedList<int, int>。 Qt中最好的类是什么?或者我应该使用STL容器?

回答

10

QMap会自动排序,因此迭代它将产生一个排序(升序)列表。

它还提供了Qmap :: upperBound()和QMap :: lowerBound(),您可以将它用于您的测距功能。

http://doc.qt.io/qt-5/qmap.html

+0

在QHash上迭代时,项目是任意排序的。使用QMap,项目总是按键**排序**。 – Yash 2016-04-05 11:29:35

-3

什么是最好的类在Qt中使用?或者我应该使用STL容器?

您可以使用std :: map。我建议只在需要将数据绑定到GUI时,才将STL容器用于业务逻辑,而Qt容器则用于此。

编辑:改变的std ::设置为std ::地图

+11

我强烈反对在QT上使用STL。通过使用STL,你将失去一些非常好的QT功能,如浅拷贝。然后你将不得不转换为QT对象来将数据传递给GUI,这会导致深层复制。而且(根据Qt Developers),STL在Qt支持的所有平台上仍然不是100%兼容的。 – 2010-04-12 16:22:55

3

我强烈建议你看看这里:Generic Containers

你会发现不同的容器类的Qt的一个很好的总结。 ..我也建议你使用其中之一!在我看来,你可以使用QMap!

希望它有一点帮助!