boost flat_map 批量插入

Posted

技术标签:

【中文标题】boost flat_map 批量插入【英文标题】:boost flat_map batch insertion 【发布时间】:2021-06-15 04:25:48 【问题描述】:

我有一个维护 boost::flat_map 的 C++ 程序。它以(key, value)的形式接收实时命令。如果值为 0,则 flat_map[key] 如果存在则应删除。如果 value 不为零,那么 flat_map[key] 应该设置为 flat_map 中的 value 如果条目已经存在,或者如果条目不存在则应该插入它。

但是,命令并不是一一来的。相反,它们是分批出现的,程序只需要在处理完每批命令后对 flat_map 进行排序。在处理一批命令的过程中,它不需要对 flat_map 进行排序。

鉴于这种灵活性,有没有办法通过避免在每次插入/删除时移动许多元素的 flat_map 开销来减少处理时间,并且只在每批结束时产生一次开销?该程序对延迟非常敏感。

感谢您的任何意见!

【问题讨论】:

只是快速搜索,但似乎确实有 void insert(InputIterator first, InputIterator last); boost.org/doc/libs/1_65_1/doc/html/boost/container/… 但请注意复杂性:最多N log(size()+N)(N是从第一个到最后一个的距离)搜索时间加上N*size()插入时间我> 它说“当且仅当没有元素的键与该元素的键等效时,从范围 [first,last) 中插入每个元素”,但有时会有一个现有的键等于到新键,在这种情况下应该更新相应的值,我不知道插入函数会这样做。抱歉,我应该澄清一下,每个命令只是一个(键,值)对,并且程序在实际执行搜索之前不知道它是新插入还是值更新 不是所有的insert语句都一样吗? 我目前正在使用这个版本,所以如果密钥已经存在,我有迭代器:“std::pair insert(const value_type & x); 效果:插入 x if且仅当容器中不存在与 x 的键等效的元素时。返回:当且仅当插入发生并且对的迭代器组件指向该元素与 x 的键等效的键。" 【参考方案1】:

您可以使用extract_sequence / adopt_sequence 来更新底层向量,只要它最终是有序且唯一的,开销中只有一对向量移动。

auto underlying = my_map.extract_sequence();

// merge underlying and batch

my_map.adopt_sequence(boost::ordered_unique_range_t, std::move(underlying));

【讨论】:

这不是丢弃所有旧值吗? @appleapple 提取现有值,按照您喜欢的方式更新它们,然后采用它们回来 也许您可以添加一些示例代码,这对我来说并非易事。 typedef implementation_defined sequence_type 绝对没有帮助 @appleapple 它在​​下面进一步解释。 boost::flat_map<Key, Value>::sequence_typestd::vector<std::pair<Key, Value>, boost::new_allocator<std::pair<Key, Value>>> 的别名 @appleapple 但确切的类型并不有趣。我们真的只需要知道它是decltype(my_map)::sequence_type

以上是关于boost flat_map 批量插入的主要内容,如果未能解决你的问题,请参考以下文章

批量插入数据

Java--MyBatis批量插入批量更新和批量删除

jdbc-批量插入批量删除批量更新

在实体框架中批量插入后批量插入记录并获取它们的 ID

jdbc批量插入实现大批量数据快速插入

mybatis批量插入批量删除