小编wxS*_*yan的帖子

std :: unordered_map如何存储和比较其键以实现对元素的快速访问而无需排序?

据我所知,std :: unordered_map用于快速访问元素。这是通过存储和比较密钥哈希而不是密钥本身来实现的。同样,无序意味着其中的元素未排序。但是要快速访问元素,需要对项目进行排序,以便能够使用二进制搜索找到请求的项目。

  • 这是否意味着unordered_map中的项目是根据其哈希键进行排序的,而导致unordered_map比映射到访问元素的映射更快的唯一原因是比较哈希值通常比比较键值要快得多?
  • 如果是这样,则在unordered_map和map之间进行选择取决于键的类型。我对吗?
  • 最后一个问题是为什么unordered_map不能像地图一样获得Compare模板参数?unordered_map如何仅通过相等的运算符比较键哈希?

    template <class Key,
              class T,
              class Compare = less<Key>,
              class Alloc = allocator<pair<const Key,T> >
              > class map;
    
    template <class Key,
              class T,
              class Hash = hash<Key>,
              class Pred = equal_to<Key>,
              class Alloc = allocator< pair<const Key,T> >
              > class unordered_map;
    
    Run Code Online (Sandbox Code Playgroud)

c++ hash dictionary unordered-map

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

CMake(Ninja 后端)使用 /MT 编译

我有一个与此CMake 编译类似的问题,使用 /MT 而不是 /MD但有一些差异:

我正在使用 Visual Studio 2017 使用 CMake 和 Ninja 生成器构建一个库。Visual Studio 为我提供了一些选择(配置),例如 x86-Debug 等。还有一个 CMakeSettings.json 文件,似乎我可以通过它来操作 Visual Studio 的默认配置。但我不知道怎么做!

我想用 /MT 编译我的库,但我不想像上面的帖子那样在 CMakeLists.txt 文件中对其进行硬编码。这意味着我想根据用户选择通过配置来编译我的库。

CMakeSettings.json 文件中是否有任何变量可以帮助我定义 /MT 编译器开关?图书馆的静态/动态建设怎么样?有关于此文件的任何帮助吗?

c++ cmake ninja visual-studio-2017

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

使用 /MD 开关构建静态版本的 OpenSSL 库

使用其默认配置构建 OpenSSL 可为您提供库的动态版本。根据其Wiki上的 OpenSSL 编译和安装文档,有一个名为 no-shared 的配置选项,它禁用共享对象并仅创建一个静态库。

Visual C++ 编译器将二进制文件(库或应用程序)链接到 libcmt(d).lib(使用 /MT(d) 将本机 CRT 启动静态链接到您的代码中)或 msvcrt(d).lib(本机 CRT 的静态库使用 /MD(d) 启动以与 DLL UCRT 和 vcruntime 一起使用。

链接本身以不同方式链接到 CRT 的二进制文件会导致冲突。不幸的是,OpenSSL 没有给我们设置这个编译器开关的选项。它总是使用 /MD 构建其动态版本,使用 /MT 构建其静态版本。那么,当我们有其他使用 /MD 链接的静态库(例如 Qt)时,当我们想要将它的静态版本链接到我们的应用程序时,我们应该怎么做?

openssl visual-c++

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