C++ 如何实现与std::map一起使用的自定义分配器?
我正在寻找一些关于如何实现与C++ 如何实现与std::map一起使用的自定义分配器?,c++,c++11,stdmap,qcustomplot,C++,C++11,Stdmap,Qcustomplot,我正在寻找一些关于如何实现与std::map一起使用的自定义分配器的指针。我感兴趣的是用数百万个条目填充映射,而不必为容器中的每个元素分配(这是该容器的默认值)。这样做的原因是将数据传递给第三方库,该库使用地图存储图表样本(QCustomPlot),我感觉在绘制大型时间序列时性能受到了影响 如果预先知道std::map的大小,是否可以通过一次分配来实现这一点 编辑: 节点将按升序馈送到容器中。在这种情况下,自定义分配器唯一能做的就是避免默认分配器因对齐而使用的一些开销,如果您知道std::map
std::map
一起使用的自定义分配器的指针。我感兴趣的是用数百万个条目填充映射,而不必为容器中的每个元素分配(这是该容器的默认值)。这样做的原因是将数据传递给第三方库,该库使用地图存储图表样本(QCustomPlot),我感觉在绘制大型时间序列时性能受到了影响
如果预先知道std::map
的大小,是否可以通过一次分配来实现这一点
编辑:
节点将按升序馈送到容器中。在这种情况下,自定义分配器唯一能做的就是避免默认分配器因对齐而使用的一些开销,如果您知道std::map由于内部指针而产生的最终大小和开销,您可以保留一个具有所需大小的缓冲区,并在自定义分配器中使用所有连续内存 这将节省的内存量取决于您在地图上使用的类型,我认为不会太多 正如ÖöTiib和dau_sama在评论中提到的那样,您最好的选择是boost::flat_map,或者您可以通过自定义
std::vector<std::pair<Key,Value>>
std::vector
无论如何,如果您不能更改第三方库,并且它只接受std::map,那么您仍然会运气不佳,除非它接受某种类型的迭代器,您可以进行调整。也许这就回答了您的问题?这是可能的,但请注意,所需的大小不是
(sizeof(Key)+sizeof(Value))*num_elem
。您将需要在某种程度上进行过度分配,因为映射
首先要做的事情之一是使用某种内部树节点类型来保存每个元素。除此之外,我的建议是阅读std::allocator
和std::allocator\u traits
文档,然后看看stdlib是如何实现前者的(假设您找不到关于该主题的教程)。图形上显示的内容通常是顺序的,因此可能是boost::flat\u映射(它是一个隐藏的排序向量)比std::map好。如果您也可以随意更改客户端代码,我建议您也使用boost::flat_map,它完全满足您的需要。另外:你能详细说明你需要存储什么样的价值观吗?一个简单的解决方案可以很容易地将值存储在一个向量中,并根据您的特定条件对向量进行一次排序。