Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C++;_Java_C++_Hashmap_Unordered Map - Fatal编程技术网

Java C++;

Java C++;,java,c++,hashmap,unordered-map,Java,C++,Hashmap,Unordered Map,我有一个应用程序(在C++中),其中我需要字符串和整数之间有一组配对,即: ("david", 0) ("james", 1) ("helen", 2) ... 如果我们使用java(键,值)定义,我需要能够(1)搜索以查看映射中是否存在键,(2)检索与给定字符串(键)关联的值。在java中工作时,我发现HashMap类型可以处理我需要的一切 我想做同样的事情,但是在C++中。我做了一些谷歌搜索,发现在C++ 2011库中有一个无序的映射类型来复制这个。 我很好奇这是否是最好的办法 在我的应

我有一个应用程序(在C++中),其中我需要字符串和整数之间有一组配对,即:

("david", 0)
("james", 1)
("helen", 2)
... 
如果我们使用java(键,值)定义,我需要能够(1)搜索以查看映射中是否存在键,(2)检索与给定字符串(键)关联的值。在java中工作时,我发现HashMap类型可以处理我需要的一切

我想做同样的事情,但是在C++中。我做了一些谷歌搜索,发现在C++ 2011库中有一个无序的映射类型来复制这个。 我很好奇这是否是最好的办法

在我的应用程序中,我对集合有以下规则

  • 整数始终是顺序的(如示例所示),从0开始
  • 整数值永远不会改变
  • 映射是在应用程序开始时创建的,不会更改,即它是不可变的
  • 字符串键没有重复项
  • 创建映射后,我不知道需要使用多少键(扩展为整数值)。我的应用程序的一个参数是包含要使用的单词列表的文本文件的目录
  • 我不在乎与此相关的启动时间成本。我需要的主要任务(即containsKey(..)和get(key)要尽可能快)。它将被称为很多。该应用程序的中心是处理大型文本语料库(即维基百科)和形成单词/文档之间的共现矩阵 我认为不是同时存储整数和字符串,而是将字符串存储在某种列表类型中,然后返回索引,即。 数据={“大卫”、“詹姆斯”、“海伦”、…}

    然后像find_Map(数据,键)这样的东西返回它所在的索引(值)。我认为这可以通过首先按升序排序并应用搜索算法来加速。但是,这只是一个猜测


    我理解这是一个普遍的问题,存在许多不同的方法。我将编写一些不同的想法,但我认为最好先让小组成员看看你们的想法

    您可以使用
    unordered_-map

    简单的答案当然是
    std::unordered_-map
    。但是,为了获得更多功能和自动索引一致性,我们可以使用
    boost::multi_index_container

    例如:

    namespace bmi = boost::multi_index;
    
    // Define a custom container type
    using my_map = boost::multi_index_container<
        // It holds StringValue objects
        StringValue,
        bmi::indexed_by<
            // first index is called by_string, is a unique hashed index with constant time lookuo
            bmi::hashed_unique<bmi::tag<by_string>, bmi::member<StringValue, std::string, &StringValue::str>>,
    
            // second index is called by_value, is a unique hashed index with constant time lookup
            bmi::hashed_unique<bmi::tag<by_value>, bmi::member<StringValue, int, &StringValue::value>>,
    
            // second index is called ordered_by_value, is a unique ordered index with logarithmic time lookup
            bmi::ordered_unique<bmi::tag<ordered_by_value>, bmi::member<StringValue, int, &StringValue::value>>
        >
    >;
    
    预期产出:

    print by value index:
    [ { "str": "B", "value": 3 }, { "str": "D", "value": 1 }, { "str": "A", "value": 4 }, { "str": "C", "value": 2 } ]
    
    print by value index unordered:
    [ { "str": "B", "value": 3 }, { "str": "D", "value": 1 }, { "str": "A", "value": 4 }, { "str": "C", "value": 2 } ]
    
    print by value index ordered:
    [ { "str": "D", "value": 1 }, { "str": "C", "value": 2 }, { "str": "B", "value": 3 }, { "str": "A", "value": 4 } ]
    
    find an element by value in constant time:
    C
    
    文件:


    根据要存储的数据量,有两种可能:

    • 对于半大数据量,我认为一个
      std::unordered_map
      就可以了
    • 如果您想处理大量数据,那么考虑使用更专用的字符串存储数据结构可能会有所帮助,例如,trys,其中带有公共前缀的字符串存储在公共子树中。这还可以提高空间利用率,因为数据会被压缩。据我所知,最有效的实现是python pytries包中也使用的

    你应该重写这个问题,因为你把键和值混淆了——例如,当你说“检索与给定字符串相关联的键”——这里我认为字符串就是键。Cheers@davidback——可以。你可以查找struct.BTW——假设你已经测量了你的程序,并且确信这两个操作包含()和find()是花费时间的地方,这就是为什么你需要尽快找到它们——还需要知道有多少查找是成功的还是未成功的。换言之,在搜索时是否更有可能找到该关键字,还是没有找到?不过,一般来说,无序的_映射没有问题,除非你真的受到时间限制。我建议删除Java标签广告,这与Java没有什么关系。也与你的变量名一致:C++中没有所谓的整型。到底什么是<代码>无序列表>代码>?谢谢你的帖子!对于C++,我还是很新的,所以我不得不读过几次(我还不熟悉的一些语法),但是再一次,谢谢HAPPS——我希望我能够“阅读”并理解这一点。
    print by value index:
    [ { "str": "B", "value": 3 }, { "str": "D", "value": 1 }, { "str": "A", "value": 4 }, { "str": "C", "value": 2 } ]
    
    print by value index unordered:
    [ { "str": "B", "value": 3 }, { "str": "D", "value": 1 }, { "str": "A", "value": 4 }, { "str": "C", "value": 2 } ]
    
    print by value index ordered:
    [ { "str": "D", "value": 1 }, { "str": "C", "value": 2 }, { "str": "B", "value": 3 }, { "str": "A", "value": 4 } ]
    
    find an element by value in constant time:
    C