c++中map和unorderedmap与java中hashmap和linkedhashmap

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中map和unorderedmap与java中hashmap和linkedhashmap相关的知识,希望对你有一定的参考价值。

参考技术A

c++中 map 底层直接是一颗红黑树所以输入进map的key会自动排序,挨个遍历key的话也是按照排序后的key依次遍历,查找key效率就是红黑树的查找效率。
unorderedmap 底层先是哈希表,所以key值无序,所以理想情况下查找效率是O(1), 类似于java中hashmap的实现。
map和unorderedmap想实现按照插入key的顺序来遍历可以自己使用vector记录key插入顺序,然后按照vector中key值依次遍历。
原文链接: https://blog.csdn.net/liuyueyi25/article/details/78511278

将 JNI -> jobject(基本上是映射和/或 java 文件中的映射)转换为 std::map(c++)

【中文标题】将 JNI -> jobject(基本上是映射和/或 java 文件中的映射)转换为 std::map(c++)【英文标题】:Convert JNI -> jobject (basically map and/or map of map in java file) to std::map(c++) 【发布时间】:2019-01-18 07:36:19 【问题描述】:

我在 java 文件中有一个本地方法:-

class JNITest
    public native void test(String param1, Map<String, Number> param2, Map<String, Map<String, Double>> param3)

从java生成头文件后,map转换为头文件方法中的jobject:-

JNIEXPORT void JNICALL Java_com_jni_JNITest_test
(JNIEnv *env,
jobject self,
jstring param1,
jobject param2,
jobject param3)  

我在 cpp 中有一个本地方法:

int cpp_native(
std::string param1,
std::map<std::string, float>& param2,
std::map<std::string, std::map<std::string, float> >& param3)  

问:- 我需要将 Jobject 转换回 std::map(cpp) 以将其传递给 cpp 本机方法,有人可以建议标准方法来做同样的事情吗? 提前致谢。

【问题讨论】:

您可以尝试使用 JavaCPP 从 Java 访问 std::map:github.com/bytedeco/javacpp 如果您有兴趣,请告诉我,我可以提供一些示例代码作为答案。 【参考方案1】:

我们在 C++/Java 集成方面做了大量工作。跨边界传递复杂数据结构的问题是您必须编组方法调用,这可能是一项非常复杂且容易出错的工作。我发现这样做更容易:

在 Java 端,使用 gson 或 jackson 将您的地图序列化为 JSON 越界传递 JSON 字符串 在 C++ 端将 JSON 反序列化为 std::map

我对 C++ 方面不太熟悉,但我看到类似的问题正在解决here

【讨论】:

【参考方案2】:

这需要一点努力。看这里:

http://jnicookbook.owsiak.org/recipe-No-020/

另外,在这里查看与将 Map 传递到本机代码相关的示例

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo037 https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo038

【讨论】:

【参考方案3】:

您可以使用scapix::link::java C++ JNI 库在许多 C++ 和 Java 类型之间进行自动转换。这是example:

#include <scapix/java_api/java/lang/System.h>
#include <scapix/java_api/java/util/Locale.h>
#include <scapix/java_api/java/text/DateFormatSymbols.h>

using namespace scapix::link::java;
using namespace scapix::java_api;

void test1()

    // C++ objects are automatically converted to and from corresponding Java types.
    // This works for any type supported by scapix::link::java::convert() interface,
    // which supports many STL types and can be extended for your own types.

    std::string version = java::lang::System::getProperty("java.version");
    std::vector<std::string> languages = java::util::Locale::getISOLanguages();
    std::vector<std::vector<std::string>> zone_strings = java::text::DateFormatSymbols::getInstance()->getZoneStrings();
    std::map<std::string, std::string> properties = java::lang::System::getProperties();

【讨论】:

以上是关于c++中map和unorderedmap与java中hashmap和linkedhashmap的主要内容,如果未能解决你的问题,请参考以下文章

5月4日:unordermap/set,哈希以及哈希常用的拉链法,开放地址法,以及模板的特化相关应用

Unordered map 有一个错误,指出函数本身在库 C++ 中不存在

unordered map 和map的区别

将 SWIG 与 C++ 的 std::map 一起使用时,Java 没有迭代器

unordered map占用内存怎么计算

将 JNI -> jobject(基本上是映射和/或 java 文件中的映射)转换为 std::map(c++)