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_type
是 std::vector<std::pair<Key, Value>, boost::new_allocator<std::pair<Key, Value>>>
的别名
@appleapple 但确切的类型并不有趣。我们真的只需要知道它是decltype(my_map)::sequence_type
以上是关于boost flat_map 批量插入的主要内容,如果未能解决你的问题,请参考以下文章