问题标签 [boost-bimap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何通过boost bimap找到内存占用
我有一个boost bimap
我有大约 180000000 个条目。理论上它应该占用大约 2.7GB 的空间(180000000*8*2 = 2880000000 字节 = 2880000000/ 1024*1024*1024 = ~2.7GB)。现在我想找到实际占用的空间boost bimap
,我该怎么做。
c++ - Boost bimap 占用大量内存
我调查了这个,但对我没有帮助。
我有一个boost bimap
我有 100 万个条目的地方long long int
。理论上它需要 1000000*8*2 字节 = 16 MB 内存。但我发现使用的总内存为 73 MB。我不知道出了什么问题。
以下是示例代码:
主文件
索引.cpp
索引.h
libboost-all-dev 信息
c++ - 将 boost::dynamic_bitset<> 插入 boost::bimap
我正在尝试boost::dynamic_bitset<>
插入boost::bimap
. 但是,与插入整数或字符串相比,它非常慢。给出了最小的例子,代码如下所示
对于 500 万个字符长的字符串,将整数/字符串插入bimap
. 为什么boost::dynamic_bitset<>
很慢,我该如何改进它。
c++ - 使用 boost::dynamic_bitset 作为键值对序列化 boost::bimap
我有兴趣序列化一个boost::bimap
包含boost::dynamic_bitset
,以便我可以保存它并在需要时加载回来。我已经尝试过这样做,但我遇到了很多错误。我随身携带的代码如下。
我该怎么做?。
编辑_1:
在中显示编译器和链接器设置Eclispse
(因为我在@sehe 提供的答案代码中遇到了一些错误)。
EDIT_2
linux终端上使用的命令g++ -std=c++14 -Os -Wall -pedantic -pthread main.cpp -lboost_serialization && ./a.out
编辑 3
使用g++ -std=c++14 -Os -Wall -pedantic -pthread main.cpp -lboost_serialization && ldd a.out
我得到以下信息
c++ - 以高效的方式创建、访问、存储和加载 boost::bimap
继续我之前的问题以序列化位集以避免在相同数据上重复创建 bimap,因此请保存 bimap 并在需要时加载。
我选择成对boost::bimap
存储数据(在位集中),<key,value>
因为它使用散列技术并且需要 O(1) 操作来搜索。bimap
可能有 4000 万个位集条目,并希望执行以下操作。
bimap
在尽可能短的时间内插入位集。回答我之前的问题需要更多时间(与2下给出的哈希函数相比,25 万个位集条目需要将近 5 秒,是 5 倍)。出于同样的原因unordered_set_of
并被unordered_multiset_of
使用。与下面的哈希函数不同,我想
/li>bimap
尽可能少地消耗内存并避免复制。O(1) 搜索键/值。
在短时间内加载bimap。同样,加载 bimap 需要很长时间(对于 25 万个条目、大小为 12 MB 的 bimap 大约需要 20 秒)。
因此,我想针对我已经提出的问题实现 1、2、3 和 4 ,其答案代码@sehe如下所示。
编辑
AIM
我有一个真实的例子,我有一个大字符串,例如 2000 或更多百万个字符,例如 40-1 亿个长度为 200 或更多字符的短字符串。我的目标是在大字符串中搜索这些短字符串。我想bimap
为大字符串创建位集,然后在 bimap 中搜索短字符串。我还想用它unordered
来非常快地获得插入和搜索,不像ordered
.
密钥位集长度约为 3-40(一次所有组合)。
值位集长度在 100-2000 左右(一次只有一个,例如如果它是 100,那么所有值条目将在 90-110 左右)。
c++ - 使用 TBB 插入无序提升 bimap
我对TBB
. 我正在尝试将<key, value>
pair 插入无序 bimap 中,其中key
is 是 typeuint64_t
并且value
是 type string
。我尝试创建文件中的loop object
,TBB.h
看起来像
在main
函数中TBB.cpp
,我试图调用函数
它从 0 开始并经过 n。我试图增加i
5(首先++i
和i +=kmer_len-1
,就像i = 0, 5, 10, 15, ...
直到 n),但i
只增加 1。
完整代码如下所示:
待定文件
待定.h
问题是i
增加 1,但我尝试将其增加 5,如上所述。
c++ - 通过与 bimap 键类型不同的类型在 boost::bimaps::bimap 中查找元素
我有以下代码:
根据boost文档
如果 (CompatibleKey, Hash, Pred) 是 (Hash, Pred) 的兼容扩展,则称类型 CompatibleKey 是 (Hash, Pred) 的兼容键。这意味着 Hash 和 Pred 接受 CompatibleKey 类型的参数,这通常意味着它们有几个对应的 operator() 成员函数的重载。
所以我认为这auto it = bm.right.find(1u);
会奏效。不幸的是,这会产生编译错误:
我的问题是,是否甚至可以使用与 bimap 键类型不同类型的 CompatibleKey?我已经尝试过提升标题,不幸的是,实现太复杂了,我无法理解发生了什么。
c++ - boost::bimap 对内射函数来说是不是矫枉过正?
令 T_1 和 T_2 为两种类型, f: Dom(T_1) -> Dom(T_2) 为非双射的单射函数;为了讨论起见,假设我将 f 表示为不同的对,而不是用于计算它的代码。现在,我需要能够相对快速地应用 f 和 f^{-1},所以我正在考虑每个方向的地图。然后我想到我可能想要一个用于这两个映射的数据结构——因为我有多个这样的 f。
我很自然地想“嗯,我确定 Boost 肯定有这样的东西”,事实上,Boost 有一个Bimap结构。问题是,它适用于一般的二元关系;此外,它必须考虑重复插入的可能性,而无需每次都重新优化结构,而在我的情况下,我只插入一次,然后进行多次查找。所以,我觉得 bimap 对我来说可能有点矫枉过正,并且没有针对我的用例进行优化。真的吗?
笔记:
- 我对以空间为代价的时间复杂度(和实际时间)感兴趣。
- 非内射 f 的相同问题(其中 f^{-1} 是非函数关系)。
c++ - C++ bimap 是否可以在视图的一侧具有与视图值的另一侧不同的键?怎么做?
一开始我需要一张地图,所以我使用了std::map。
然后,添加了一些要求,我还需要获取“值”的“键”(bar 的 foos),所以我使用了
在那之后,添加了一些更多的要求,所以现在我需要为每个 foo 存储一个数字,并且从右侧视图我需要能够调用<bimap>.righ.find(bar)
并获取成对的(foo + number stored for foo),但我仍然希望能够打电话<bimap>.left.find(foo)
和得到吧。
如何做到这一点?如果可能的话,我更喜欢一些现代 C++ 而不是 boost,但我想如果没有 boost,就很难拥有 bimap 功能。
编辑:我应该注意尺寸很重要,所以我不想存储任何涉及的部分两次,速度也很重要。
我应该有类似
"foo1"+100 <-> "bar1"
and
的东西"foo2"+300 <-> "bar4"
。
我希望能够调用<bimap>.left.find("foo1")
并获取“bar1”,
但也可以<bimap>.right.find("bar1")
获取pair(“foo1”,100)。
c++ - 是否可以覆盖 boost::bimaps::bimap.left 的“查找”和“擦除”方法?怎么做?
我有以下内容:
我希望能够像这样调用查找和擦除方法:
instance.left.find("foo")
代替instance.left.find({"foo",1})
和
instance.left.erase("foo")
代替instance.left.erase({"foo",1})
.
我只想使用“foo_and_number_helper”的“foo”部分,而不是从左侧调用的方法查找和擦除的两个部分。如何做到这一点?我试图阅读 bimap 实现,但我仍然很难做到。
我已经问过更广泛的问题:C++ bimap 是否可能在视图的一侧具有与视图值的另一侧不同的键?怎么做?
并且从我必须覆盖的评论中operator <
,但我什至不确定这是否足够。