C++ Boost Array与Unordered使用介绍

 更新时间:2022年11月05日 16:11:28   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

一、提要

Boost.Array 库在 boost/array.hpp 中定义了类模板 boost::array。 boost::array 与 std::array 类似,后者是使用 C++11 添加到标准库中的。如果您使用 C++11 开发环境,则可以忽略 boost::array。

二、示例boost::array

使用 boost::array,可以创建一个与 C 数组具有相同属性的数组。此外,boost::array 符合 C++ 容器的要求,这使得处理这样的数组就像处理任何其他容器一样容易。原则上,可以将 boost::array 视为容器 std::vector,但 boost::array 中的元素数量是恒定的。

示例 14.1。 boost::array 的各种成员函数

#include <boost/array.hpp>
#include <string>
#include <algorithm>
#include <iostream>
int main()
{
  typedef boost::array<std::string, 3> array;
  array a;
  a[0] = "cat";
  a.at(1) = "shark";
  *a.rbegin() = "spider";
  std::sort(a.begin(), a.end());
  for (const std::string &s : a)
    std::cout << s << '\n';
  std::cout << a.size() << '\n';
  std::cout << a.max_size() << '\n';
}

如示例 14.1 所示,使用 boost::array 相当简单,不需要额外解释,因为调用的成员函数与来自 std::vector 的成员函数具有相同的含义。

三、Boost.Unordered

Boost.Unordered

Boost.Unordered 提供类 boost::unordered_set、boost::unordered_multiset、boost::unordered_map 和 boost::unordered_multimap。这些类与使用 C++11 添加到标准库中的散列容器相同。因此,如果您使用支持 C++11 的开发环境,则可以忽略 Boost.Unordered 中的容器。

示例 15.1。使用 boost::unordered_set

#include <boost/unordered_set.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::unordered_set<std::string> unordered_set;
  unordered_set set;
  set.emplace("cat");
  set.emplace("shark");
  set.emplace("spider");
  for (const std::string &s : set)
    std::cout << s << '\n';
  std::cout << set.size() << '\n';
  std::cout << set.max_size() << '\n';
  std::cout << std::boolalpha << (set.find("cat") != set.end()) << '\n';
  std::cout << set.count("shark") << '\n';
}

​​​ boost::unordered_set 可以替换为示例 15.1 中的 std::unordered_set。 boost::unordered_set 与 std::unordered_set 没有区别。

示例 15.2。使用 boost::unordered_map

#include <boost/unordered_map.hpp>
#include <string>
#include <iostream>
int main()
{
  typedef boost::unordered_map<std::string, int> unordered_map;
  unordered_map map;
  map.emplace("cat", 4);
  map.emplace("shark", 0);
  map.emplace("spider", 8);
  for (const auto &p : map)
    std::cout << p.first << ";" << p.second << '\n';
  std::cout << map.size() << '\n';
  std::cout << map.max_size() << '\n';
  std::cout << std::boolalpha << (map.find("cat") != map.end()) << '\n';
  std::cout << map.count("shark") << '\n';
}

Example15.2

示例 15.2 使用 boost::unordered_map 来存储几种动物的名称和腿数。再一次,boost::unordered_map 可以替换为 std::unordered_map。

示例 15.3。使用 Boost.Unordered 的用户定义类型

#include <boost/unordered_set.hpp>
#include <string>
#include <cstddef>
struct animal
{
  std::string name;
  int legs;
};
bool operator==(const animal &lhs, const animal &rhs)
{
  return lhs.name == rhs.name && lhs.legs == rhs.legs;
}
std::size_t hash_value(const animal &a)
{
  std::size_t seed = 0;
  boost::hash_combine(seed, a.name);
  boost::hash_combine(seed, a.legs);
  return seed;
}
int main()
{
  typedef boost::unordered_set<animal> unordered_set;
  unordered_set animals;
  animals.insert({"cat", 4});
  animals.insert({"shark", 0});
  animals.insert({"spider", 8});
}

在示例 15.3 中,动物类型的元素存储在 boost::unordered_set 类型的容器中。由于 boost::unordered_set 的哈希函数不知道类动物,因此无法自动计算此类元素的哈希值。这就是为什么必须定义散列函数的原因——否则无法编译示例。

要定义的哈希函数的名称是 hash_value()。它必须期望作为其唯一参数的类型的对象应该计算哈希值。 hash_value() 的返回值类型必须是 std::size_t。

当必须为对象计算哈希值时,会自动调用函数 hash_value()。此函数是为 Boost 库中的各种类型定义的,包括 std::string。对于动物等用户定义的类型,它必须由开发者定义。

通常,hash_value() 的定义相当简单:通过一个接一个地访问对象的成员变量来创建哈希值。这是通过函数 boost::hash_combine() 完成的,该函数由 Boost.Hash 提供并在 boost/functional/hash.hpp 中定义。如果使用 Boost.Unordered,则不必包含此头文件,因为此库中的所有容器都访问 Boost.Hash 来计算哈希值。

除了定义 hash_value() 之外,您还需要确保可以使用 == 比较两个对象。这就是示例 15.3 中运算符 operator== 为动物重载的原因。

C++11 标准库中的散列容器使用头文件中的散列函数函数。 Boost.Unordered 的散列容器需要散列函数 hash_value()。是否在 hash_value() 中使用 Boost.Hash 并不重要。 Boost.Hash 是有意义的,因为像 boost::hash_combine() 这样的函数可以更容易地从多个成员变量逐步计算哈希值。然而,这只是 hash_value() 的一个实现细节。除了使用不同的散列函数之外,Boost.Unordered 的散列容器和标准库中的散列容器基本上是等价的。

到此这篇关于C++ Boost Array与Unordered使用介绍的文章就介绍到这了,更多相关C++ Array与Unordered内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现双目立体匹配Census算法的示例代码

    C++实现双目立体匹配Census算法的示例代码

    这篇文章主要为大家详细介绍了如何利用C++实现双目立体匹配Census算法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • C语言实现实验设备管理系统

    C语言实现实验设备管理系统

    这篇文章主要为大家详细介绍了C语言实现实验设备管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C语言指针用法总结

    C语言指针用法总结

    本文详细讲解了C语言指针用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 关于C语言qsort函数详解

    关于C语言qsort函数详解

    这篇文章主要介绍了关于C语言qsort函数详解的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • C/C++最短路径算法之迪杰斯特拉Dijkstra的实现详解

    C/C++最短路径算法之迪杰斯特拉Dijkstra的实现详解

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。本文将详解该算法的图解与实现,需要的可以参考一下
    2022-07-07
  • QT实现秒表项目

    QT实现秒表项目

    这篇文章主要为大家详细介绍了QT实现秒表项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Qt实现绘制网格背景的示例代码

    Qt实现绘制网格背景的示例代码

    这篇文章主要介绍了Qt如何实现绘制网格背景,并且能实现窗口大小调整时网格背景也自动调整重绘,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • Qt使用QChart实现动态显示温度变化曲线

    Qt使用QChart实现动态显示温度变化曲线

    Qt的QChart是一个用于绘制图表和可视化数据的类,提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,所以本文就将使用QChart实现动态显示3个设备的温度变化曲线,感兴趣的可以了解一下
    2023-06-06
  • C语言进阶二叉树的基础与销毁及层序遍历详解

    C语言进阶二叉树的基础与销毁及层序遍历详解

    朋友们好,这篇播客我们继续C++的初阶学习,现在对我们对C++的二叉树基础oj与二叉树销毁和层序遍历进行练习,让我们相互学习,共同进步
    2022-06-06
  • C++人工模拟栈实现方法

    C++人工模拟栈实现方法

    在本篇内容里小编为大家整理了关于C++人工模拟栈实现方法和步骤,需要的朋友们可以学习下。
    2018-12-12

最新评论