如果地图在升级中是二进制激活的,那么加载nlogn的时间还是n?
如果map简单地一次写入一个元素,那么加载n个项目似乎需要nlogn,因为我们正在插入n个项目并且每个项目需要记录时间。
但是我想知道地图是否可以用与内存布局和marshelled指针匹配的格式编写。所以加载它然后我认为将需要n次。基本上正在加载内存布局。
有没有人有这方面的经验?
答案 0 :(得分:1)
我没有查看源代码,但是......
如果我正在编写std::map
的序列化代码,我会记得在编写数据时,它将由比较函数(通常为std::less
)进行排序。
我会记得std::map::insert
有一个允许我指定开始搜索插入点的位置提示的版本。
回想一下从档案中读取的数据是按升序排列的,我需要做的就是:
while(read_count--)
{
std::pair<K,V> entry;
archive >> entry;
mymap.insert(std::end(mymap), entry);
}
所以实际上它将是线性时间。
答案 1 :(得分:0)
像理查德所说,但我更喜欢boost::container::flat_map
。这个构造函数允许您插入已知的已经订购的范围:http://www.boost.org/doc/libs/1_66_0/doc/html/boost/container/flat_map.html#idp38577632-bb
我不认为默认序列化会利用这一点,因此您可能希望基于此推出自己的序列化。
作为奖励:如果您的键/值对是自包含的和POD,您可以将它们序列化。