- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 using Boost.bimap for implementing a LRU cache,有一些包含字符串的复杂键。
问题是我每次调用 find() 时都会复制 key 。我想避免这种不必要的复制(一般来说:制作尽可能少的字符串拷贝,也许通过模板?)
一个最小的测试用例(带有 gist version ):
#include <string>
#include <iostream>
#include <boost/bimap.hpp>
#include <boost/bimap/list_of.hpp>
#include <boost/bimap/set_of.hpp>
class Test
{
public:
struct ComplexKey
{
std::string text;
int dummy;
ComplexKey(const std::string &text, int dummy) : text(text), dummy(dummy) {}
~ComplexKey()
{
std::cout << "~ComplexKey " << (void*)this << " " << text << std::endl;
}
bool operator<(const ComplexKey &rhs) const
{
return tie(text, dummy) < tie(rhs.text, rhs.dummy);
}
};
typedef boost::bimaps::bimap<
boost::bimaps::set_of<ComplexKey>,
boost::bimaps::list_of<std::string>
> container_type;
container_type cache;
void run()
{
getValue("foo", 123); // 3 COPIES OF text
getValue("bar", 456); // 3 COPIES OF text
getValue("foo", 123); // 2 COPIES OF text
}
std::string getValue(const std::string &text, int dummy)
{
const ComplexKey key(text, dummy); // COPY #1 OF text
auto it = cache.left.find(key); // COPY #2 OF text (BECAUSE key IS COPIED)
if (it != cache.left.end())
{
return it->second;
}
else
{
auto value = std::to_string(text.size()) + "." + std::to_string(dummy); // WHATEVER...
cache.insert(typename container_type::value_type(key, value)); // COPY #3 OF text
return value;
}
}
};
最佳答案
Bimap 没有直接使用 std:map
(我这么说是因为您正在使用 set_of
),而是通过不同的容器适配器创建 View ,并在此过程中 key 被复制。不可能按照您在问题中定义 bimap 的方式显着 boost 性能。
为了在 ComplexKey 方面从 bimap 获得更好的性能,您宁愿必须存储指向 ComplexKey 的指针(最好是原始的;没有隐含的 key 所有权bimap)并提供你自己的分类器。指针的复制成本很低,缺点是您必须与映射并行管理键的生命周期。
做一些事情,
std::vector<unique_ptr<ComplexKey>> ComplexKeyOwningContainer;
typedef boost::bimaps::bimap<
boost::bimaps::set_of<ComplexKey*, ComplexKeyPtrSorter>,
boost::bimaps::list_of<std::string>
> container_type;
请注意,如果您追求性能,您还需要注意 std::string
,它是您的 bimap 的另一侧。它们可能非常昂贵,临时的很常见,并且它们会遇到与 ComplexKey key 相同的问题。
关于c++ - 使用 Boost.bimap 时如何避免键复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21112208/
我有以下代码: #include #include #include using namespace boost::bimaps; using namespace boost; struct E
我有以下内容: struct foo_and_number_helper { std::string foo; uint64_t number; }; struct foo_and_numbe
我有一个这样的双图: using MyBimap = boost::bimaps::bimap, boost::bimaps::unordered_set_of>; 我想从静态初始化列表构造它
我正在审查 Google Guava API 的功能,并遇到了一种我在“现实世界编程”经验中从未见过的数据结构,即 BiMap。这种构造的唯一好处是能够快速检索给定值的 key 吗?是否存在使用 Bi
我有一个像这样的无序 bimap: using SymPressMap = boost::bimap, boost::bimaps::unordered_se
如果不使用 BiMap 的 .inverse() 函数,您将如何进行反向映射? 我得到了: public static Map> reverseMapping(Map mapping) 我尝试过类似的
根据这个question中使用boost::bimap的建议, 我有一个关于如何解决 bimap 中重复键的问题。 如果我有: , ,是否可以在bimap中插入两次? 我看到了描述 Collecti
我使用了很多形式的容器 boost::bimap, boost::bimaps::set_of > 我在一个头文件中定义它们,这个头文件包含在很多 cpp 文件中(这是在我尽可能限制头文件的公开之后)
我正在尝试获取通过其键访问的值。到目前为止,我有一个我尝试过的最小示例,并且仅适用于左侧访问。 #include #include #include #include #include #i
我想访问 bimap 中重复元素的所有键。我在下面有一些示例代码 #include #include #include #include #include #include namespa
好的,所以我声明了一个 boost::bimap: boost::bimap object_list; 其中 object 和 position 分别是一个类和一个结构。 在 bimap 中存储的当前
Java 编程 迭代 map 的问题 Iterator iterator = plugin.inreview.keySet().iterator(); while (iterator.hasNext(
设 T_1 和 T_2 是两种类型,f: Dom(T_1) -> Dom(T_2) 是一个非双射的单射函数;为了便于讨论,假设我将 f 表示为不同的对,而不是用于计算它的代码。现在,我需要能够相对快速
我正在寻找双向无序 map 。目前,我只有这个。问题是,我不能使用 []。我认为 boost 默认为列表类型。但我想要一个 HashMap 。这怎么可能? #include #include bo
我正在尝试为 C++ 中的枚举创建一个简单的双向查找工具。我的单向查找工作正常... enum MyEnum { One, Two, Three }; const boost:
我正在模板化类中嵌入 boost::bimap,经过多次试验和错误,我发现了一些可以编译的东西和一些不能编译的东西。我正在使用 g++ (GCC) 4.9.2 20150212 (Red Hat 4.
我对BiMap仍然很困惑在 Google collections/Guava 。据称,这两个 bimap 有相同的数据支持;对其中一个的任何更改都会出现在另一个中。 浏览了一下源码,发现Forward
我刚刚读过这篇文章 http://www.ctl.ua.edu/math103/mapcolor/mapcolor.htm 我不明白,如何将此 map (在 bimap 中)转换为图形结构。 进入 如
我想序列化 BiMap与 xStream .由于我不喜欢 xStream 为 BiMap 自动生成的代码,我认为将 BiMap 转换为 HashMap 并仅序列化 HashMap 可能是个好主意,反序
我正在尝试使用 boost::bimap 来满足我的一项要求。下面是示例代码 typedef bimap, multiset_of, set_of_relation<>
我是一名优秀的程序员,十分优秀!