问题标签 [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.

0 投票
1 回答
173 浏览

c++ - 如何通过boost bimap找到内存占用

我有一个boost bimap

我有大约 180000000 个条目。理论上它应该占用大约 2.7GB 的空间(180000000*8*2 = 2880000000 字节 = 2880000000/ 1024*1024*1024 = ~2.7GB)。现在我想找到实际占用的空间boost bimap,我该怎么做。

0 投票
0 回答
381 浏览

c++ - Boost bimap 占用大量内存

我调查了这个,但对我没有帮助。

我有一个boost bimap我有 100 万个条目的地方long long int。理论上它需要 1000000*8*2 字节 = 16 MB 内存。但我发现使用的总内存为 73 MB。我不知道出了什么问题。

以下是示例代码:

主文件

索引.cpp

索引.h

libboost-all-dev 信息

0 投票
1 回答
124 浏览

c++ - 将 boost::dynamic_bitset<> 插入 boost::bimap

我正在尝试boost::dynamic_bitset<>插入boost::bimap. 但是,与插入整数或字符串相比,它非常慢。给出了最小的例子,代码如下所示

对于 500 万个字符长的字符串,将整数/字符串插入bimap. 为什么boost::dynamic_bitset<>很慢,我该如何改进它。

0 投票
1 回答
313 浏览

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我得到以下信息

0 投票
1 回答
238 浏览

c++ - 以高效的方式创建、访问、存储和加载 boost::bimap

继续我之前的问题以序列化位集以避免在相同数据上重复创建 bimap,因此请保存 bimap 并在需要时加载。

我选择成对boost::bimap存储数据(在位集中),<key,value>因为它使用散列技术并且需要 O(1) 操作来搜索。bimap可能有 4000 万个位集条目,并希望执行以下操作。

  1. bimap在尽可能短的时间内插入位集。回答我之前的问题需要更多时间(与2下给出的哈希函数相比,25 万个位集条目需要将近 5 秒,是 5 倍)。出于同样的原因unordered_set_of并被unordered_multiset_of使用。

  2. 与下面的哈希函数不同,我想bimap尽可能少地消耗内存并避免复制。

    /li>
  3. O(1) 搜索键/值。

  4. 在短时间内加载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 左右)。

0 投票
1 回答
106 浏览

c++ - 使用 TBB 插入无序提升 bimap

我对TBB. 我正在尝试将<key, value>pair 插入无序 bimap 中,其中keyis 是 typeuint64_t并且value是 type string。我尝试创建文件中的loop objectTBB.h看起来像

main函数中TBB.cpp,我试图调用函数

它从 0 开始并经过 n。我试图增加i5(首先++ii +=kmer_len-1,就像i = 0, 5, 10, 15, ...直到 n),但i只增加 1。

完整代码如下所示:

待定文件

待定.h

问题是i增加 1,但我尝试将其增加 5,如上所述。

0 投票
2 回答
490 浏览

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?我已经尝试过提升标题,不幸的是,实现太复杂了,我无法理解发生了什么。

0 投票
1 回答
140 浏览

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} 是非函数关系)。
0 投票
1 回答
221 浏览

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)。

0 投票
2 回答
504 浏览

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 <,但我什至不确定这是否足够。