标签: bimap

是否有更高效的双向映射实现?

我创建了一个简单的双向映射类,它通过内部存储两个std::map具有相反键/值类型的实例,并提供用户友好的界面:

template<class T1, class T2> class Bimap
{
    std::map<T1, T2> map1;
    std::map<T2, T1> map2;
    // ...
};
Run Code Online (Sandbox Code Playgroud)
  • 是否有更有效的方法来实现不需要两倍内存的双向映射?

  • 通常如何实施bimap?


编辑:

  • bimap元素应该是可变的还是不可变的?(更改一个元素map1应该更改键map2,但键是常量,这是不可能的 - 解决方案是什么?)

  • 元素的所有权也是另一个问题:当用户在bimap中插入键值对时,bimap应该复制该键值对并存储它,然后内部第二个映射(具有反转的键/值)应该不复制,但指向原始对.怎么能实现这一目标?


编辑2:

我发布了一个关于Code Review的可能实现.

c++ map bimap data-structures c++11

53
推荐指数
5
解决办法
2万
查看次数

在c ++ 11中是否有Boost.Bimap替代方案?

在C++ 0x中有没有可用的替代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

我只是在寻找一个干净简单的解决方案(一个标题/源文件或一点额外,因为在我的情况下两个镜像地图同样好).

c++ stl map bimap c++11

24
推荐指数
2
解决办法
2万
查看次数

Boost :: Bimap相当于双向多图

问题的第一部分是我正在尝试使用boost :: bimap,但是从文档中我不清楚如何定义双向多图.

问题的第二部分是我需要它是一个方向的地图和另一个方向的多个地图,这可以使用boost :: bimap来完成吗?

有没有人经历过这个或者能指出我正确的页面?

c++ boost multimap bimap

17
推荐指数
2
解决办法
8766
查看次数

在Java中实例化google-collections的BiMap

如何实例化BimapGoogle集合?

我已经阅读了Java:实例化Google Collection的HashBiMap这个问题

我的代码示例

import com.google.common.collect.BiMap;

public class UserSettings {

 private Map<String, Integer> wordToWordID;

 UserSettings() {

  this.wordToWordID = new BiMap<String. Integer>();
Run Code Online (Sandbox Code Playgroud)

我得到cannot instantiate the type BiMap<String, Integer>.

java bimap guava

15
推荐指数
3
解决办法
1万
查看次数

如何在Kotlin中反转地图?

我试图扭转Kotlin的地图.到目前为止,我想出了:

mapOf("foo" to 42)
  .toList()
  .map { (k, v) -> v to k }
  .toMap()
Run Code Online (Sandbox Code Playgroud)

没有使用中间人(中间名单)有没有更好的方法呢?

dictionary bimap kotlin

11
推荐指数
2
解决办法
4038
查看次数

Kotlin中的BiMap /双向哈希图

是否有kotlin的双向hashmap?如果不是 - 在kotlin表达这个的最佳方式是什么?包括番石榴从那里获得BiMap感觉就像在一个非常小的目标上用一把非常大的枪射击 - 没有我能想象的解决方案目前感觉正确 - 我想到的最好的事情就是为它编写一个自定义类

bimap kotlin

9
推荐指数
2
解决办法
3102
查看次数

用Boost.Bimap替换向量和散列表

我想用a替换a vector<string>boost::unordered_map<string, size_t>映射字符串到前者的索引boost::bimap.

bimap应该使用什么实例?到目前为止,我已经想到了

typedef bimap<
    unordered_set_of<size_t>,
    vector_of<string>
> StringMap;
Run Code Online (Sandbox Code Playgroud)

但我不确定我现在是否已经改变了收藏类型.另外,我想知道我是否应该更改关系类型集合.一个vector_of_relation是我最好的选择,还是一个set_of_relation,或者只是默认?

c++ boost unordered-map bimap data-structures

8
推荐指数
1
解决办法
2172
查看次数

Variadic typedef,或"Bimaps完成C++ 0x方式"

简短的问题:我可以输入一个可变参数包吗?我需要template <typename ...T> struct Forward { typedef T... args; };.


长版:

我正在考虑重新实现C++ 0x中出色的boost bimap.回想一下两种类型的bimap S并且T是和之间std::set关系.对象本身存储在两个独立的内部容器中,关系跟踪我认为的相关迭代器; 两种类型都可以通过"左"和"右"查找作为键.根据内部容器的选择,值可以是唯一的,例如,如果左容器是一个集合而右容器是多集合,则可以映射到许多不同的s,右查找给出相等的范围.大众内部容器,,和,也许版本了.S xT yxysetmultisetvectorlistunordered_*

所以我们需要一个接受两个容器作为模板参数的类型:

class Bimap<S, T, std::set, std::multiset>
Run Code Online (Sandbox Code Playgroud)

但我们必须接受容器可以采用任意多个参数,因此我们也需要传递所有这些参数.如果我们只需要组可变参数,那就不会有问题,因为我们可以直接传递它们.但是,我们现在需要2套的参数,所以我想写一个转发器,使用像这样:

Bimap<int, int, std::set, std::set, Forward<std::less<int>, MyAllocator>, Forward<std::greater<int>, YourAllocator>> x;
Run Code Online (Sandbox Code Playgroud)

这是我提出的模板:

#include <set>
#include <cstdint>

template <typename ...Args>
struct Forward
{
  typedef Args... args; // Problem here!!
  static const std::size_t size = …
Run Code Online (Sandbox Code Playgroud)

bimap c++11

8
推荐指数
1
解决办法
1864
查看次数

Guava:java.lang.NoClassDefFoundError - com.google.common.collect.HashBiMap

当我使用从这里下载的guava库时,我目前面临java.lang.NoClassDefFoundError:com.google.common.collect.HashBiMap的问题:http: //code.google.com/p/guava-libraries/

我已经将guava-12.0.jar添加到我的项目中作为参考库但我仍然得到错误.你能就这个问题给出一些建议吗?谢谢您的帮助

package my.project;

import android.app.Activity;
import android.os.Bundle;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

public class MainActivity extends Activity{

     private BiMap<String,String>  bidiMap; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
          setContentView(R.layout.bible_help_cal);

        bidiMap = HashBiMap.create();           
        bidiMap.put("a","100");
        bidiMap.put("b","200");


    }


}
Run Code Online (Sandbox Code Playgroud)

我得到的错误消息

05-29 18:35:19.737: E/AndroidRuntime(376): FATAL EXCEPTION: main
05-29 18:35:19.737: E/AndroidRuntime(376): java.lang.NoClassDefFoundError: com.google.common.collect.HashBiMap
05-29 18:35:19.737: E/AndroidRuntime(376):  at my.project.MainActivity.onCreate(MainActivity.java:18)
05-29 18:35:19.737: E/AndroidRuntime(376):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
05-29 18:35:19.737: E/AndroidRuntime(376):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712)
05-29 18:35:19.737: E/AndroidRuntime(376):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
05-29 18:35:19.737: E/AndroidRuntime(376):  at android.app.ActivityThread.access$1500(ActivityThread.java:122)
05-29 18:35:19.737: E/AndroidRuntime(376):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) …
Run Code Online (Sandbox Code Playgroud)

android hashmap bimap guava

8
推荐指数
2
解决办法
3万
查看次数

在C++中使用Boost Bimap

C++ Boost有一个双向映射的Bimap容器:http: //www.boost.org/doc/libs/1_43_0/libs/bimap/doc/html/index.html

有谁知道Boost :: bimap的表现?我的意思是访问地图中元素的时间复杂度是多少?它是否与unordered_map访问一样快(哪个是O(1))?

谢谢!

c++ complexity-theory boost bimap

7
推荐指数
1
解决办法
7311
查看次数