2011-04-13 120 views
19

在C++ 0x中有没有可用的替代Boost的bimap?在C++ 11中有没有Boost.Bimap的替代品?

我想避免Boost,但完全拥抱C++ 11。如果有必要,Boost的bimap的精简版将适用于我(我需要一个不断的bimap在枚举和相应的字符串之间切换)。该地图将是编译时常量,因此甚至可能是两个手动维护的地图也不是最佳解决方案。

谢谢!

更新:我发现这个的代码项目,但它似乎许可可能是一个问题:http://www.codeproject.com/KB/stl/bimap.aspx?fid=12042&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=151#xx0xx

我只是在寻找一个干净和简单的解决方案(一个头/源文件或一点额外的,如在我的情况下,两个镜像地图是相同的)。

+5

为什么你想避免使用提升?如果它解决了你的问题......请注意,boost包含许多不同的库,其中一些将其纳入标准中,但其中许多库过于具体,无法添加到标准中。 – 2011-04-13 10:29:23

+0

@David:我明白了,但1)Windows上的Boost是一件麻烦事,2)我想用这个项目学习C++;我知道Boost是C++,它是学习它的好方法,但我想看看我可以自己做什么并发现已经存在的功能。奇怪的解释我知道,但Boost中的所有内容(我需要)都需要非头文件,至少是很大的东西。我现在已经可以很简单地避免/解决Boost问题了,我想保持这种状态。我已经将问题简化为一个容器包装器,它基本上保留了两个地图的更新,这对你自己来说并不是一件很难的事情。 – rubenvb 2011-04-13 11:07:35

+5

如何在Windows上增加一些麻烦,特别是在讨论boost.bimap这种仅包含头文件的库时?提取标题,将它们添加到包含目录中,完成。 – ildjarn 2011-04-13 19:45:18

回答

10

我的感觉是很多是进入Boost库的工作是让他们与其他库/ STL工作。

如果您不需要该功能,则可以使用std::map<X*, Y*>std::map<Y*, X*>的课程。然后有如下方法:add(X,Y),remove(X,Y),get_left(X)get_right(Y)

如果要存储副本,add(X,Y)可以分配内存,并且remove(X,Y)可以取消分配。此外,您可以定义一个析构函数,在其余元素上调用remove(X,Y)

+0

不应该是这样std:地图和std ::地图 Gio 2017-08-23 18:01:05

39

简答题:没有。

长答案:不。


应当指出的是,C++ 1 的对transparent comparators支持消除了时间* Boost.Bimap 90%的需求:当你需要关闭的任何加键给定的属性(存储或计算),通常是一个简单的,按位可比的唯一标识符固有/存在于对象中。使用透明比较器,只要所述值可以从对象中获取/计算而不会突变,就可以将对象与任何可能的值进行比较,只能根据类型进行区分。

*一个瞎猜,不是统计

+10

我不知道为什么这是如此upvoted - 我认为一个更好的“长答案”将是一个简短的解释,为什么它不被认为是必要的;什么会是一个更习惯的方法。我想很多人(我当然有罪)在他们试图以非C++方式一起破解一些东西的时候偶然发现了Boost, OP想要避免学习是件好事,我认为(不是因为我分享它)。 – OJFord 2015-03-19 16:36:58

+2

@OllieFord:这是一个相当含糊的笑话,因为“不”不是太短而不能作为自己的答案发布。 ; - ] – ildjarn 2015-03-23 01:00:38

+2

那么透明比较器如何帮助定义枚举<->字符串bimap?这将使这个答案实际上回答我的问题。目前,它看起来像一个C++ 14功能的浅广告,没有任何用处。 – rubenvb 2017-01-23 10:36:39