- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在处理一些遗留代码时,我遇到了内存问题,这主要是(我相信)由于广泛使用 STL map (特别是“ map 中的 map ”)。
我正在将 Boost flat_map 视为一种可能的解决方案。有没有人对 flat_maps 有任何第一手经验,特别是在速度和/或内存使用方面的改进?我当然知道这可能非常依赖于存储的数据类型和存储方式,但我仍然对人们的实际体验感到好奇。
谁能给我指出一些可靠的例子?
举个例子:在这个map-of-a-map的代码中有几种情况;也就是说,一个 map ,其中的值是另一个 map 。
通过用一对 vector 替换“内部”映射,我将内存占用减少了 10:1(3G 到 300M)。当然,这会减慢搜索速度,但对于这种特殊情况,这似乎无关紧要。它涉及大约一天的重构和仔细测试。
Boost 的 flat_map 听起来可能正是我所需要的,但除了 Boost 网站上的类描述之外,我似乎找不到太多关于它的信息。寻找一些第一手的反馈。
最佳答案
Boost 的 flat_map
是一个基于二叉树的映射实现,除了二叉树存储为键值对的(排序的) vector 。
你基本上可以根据这个事实自己找出关于性能的答案(相对于 std::map
):
在您的情况下 - map 的 map - 您将失去“将事物弄平”的一些好处,因为您将拥有一个带有指向内部 map 的指针的外部 map (如果不是更多级别的话)间接的);但平面 map 至少可以帮助您减少这种情况。此外,假设您有两层映射,您可以对其进行安排,以便连续存储所有内部映射(通过适当构建内部映射或使用您自己的分配器实例化它们,这是一个更棘手的方法事务);在这种情况下,您可以将指向 map 的指针替换为 map 索引,从而减少它们占用的空间量并使编译器的工作更轻松。
您可能还想阅读 Boost 的 documentation of flat_map
;你也可以使用武力阅读the source (和 source of the underlying flat_tree
)-就像我一样;我实际上没有 flat_map
经验。
关于c++ - boost flat_map 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15259196/
我正在尝试编写一个包含字符串索引和字符串中每个字符的向量。 在下面的例子中,0 J, 0 a, 0 n ... 1 J, 1i, ... fn main() { let names = vec
我一整天都在编写以下代码,(here 是围栏) /// The rule that moves state from one to another. /// /// `S` - the type pa
你好!我正在尝试完成我的第一个 RxPY 项目,但我遇到了一些问题 了解 Python 中 flat_map 的行为。 在这个项目中,有一个从生成器(Kafka 消费者)创建的 Observable。
给定结构的集合(向量/切片)。如何在每个结构的某些字段上创建组合的迭代器? 以下是使用flat_map的具体尝试: struct Game { home_team: u8, away_
我知道我们可以使用 collect移动 Result从内到外,例如: fn produce_result(my_struct: &MyStruct) -> Result; let my_results
这个问题在这里已经有了答案: Conditionally iterate over one of several possible iterators (4 个答案) 关闭 2 年前。 是否可以在
有没有办法在不切换到使用 iter 而不是 into_iter 的情况下完成这项工作? let strings: Vec = vec!["1 2".to_string(), "3 4".to_stri
我的问题的以下简化/抽象版本: fn main() { let arr = vec![1., 2., 3., 4., 5., 6., 7., 8., 9.]; let size = a
我的问题的以下简化/抽象版本: fn main() { let foo_selectors = vec![0, 1]; let foos: Vec = foo_selectors
我正在研究 Project Euler 96自学 Rust。我编写了这段代码来读取文件并将其转换为整数向量 ( Playground )。 let file = File::open(&args[1]
给定 foo 的定义: let foo = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]; 我希望能够编写这样的代码: let result: V
在处理一些遗留代码时,我遇到了内存问题,这主要是(我相信)由于广泛使用 STL map (特别是“ map 中的 map ”)。 我正在将 Boost flat_map 视为一种可能的解决方案。有没有
我正在尝试生成这样的序列:1,2,3,4,5,6,7,8,9,1,0,1,1,1,2... fn main() { let iter = (1..).flat_map(|j| j.to_str
为什么在闭包上没有类型注释的情况下可以编译? fn transform(input: &Vec>) { input.iter().flat_map(|words| words.iter());
我认为当你有一个可变长度的散列数组并且你想单独处理每个散列时,flat_map 很棒: data = [ {'apple' => 'fruit'}, {'carrot' => 'vegetab
编辑:因为我用错误的例子写了问题并且没有描述我的问题,我会再做一次! 在我看来,#flat_map 尽管是 Enumerator::Lazy 类的一部分,但它本身并不是非常可枚举的。 这个例子可以正常
我认为我对生命周期有很好的理解,但我读到的内容与编译器在闭包方面所说的不一致;) 我有一个带有签名的函数: fn split_to_words(content: &str) -> Vec 使用 for
我希望能够重复一个过程,在该过程中,我们正在迭代的集合被更改 n 次。 n 仅在运行时已知,可以由用户指定,因此我们不能将其硬编码到类型中。 通过 collect 在迭代之间使用中间数据结构的方法是可
我正在尝试创建一个管道,以使用 TensorFlow Dataset API 和 Pandas 读取多个 CSV 文件。但是,使用 flat_map 方法会产生错误。但是,如果我使用 map 方法,我
我正在使用数据集 API,读取数据如下: dataset = tf.data.TFRecordDataset(filename, compression_type="GZIP") dataset =
我是一名优秀的程序员,十分优秀!