我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++BoostArray与Unordered使用介绍

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++BoostArray与Unordered使用介绍

一、提要

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++BoostArray与Unordered使用介绍

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++BoostArray与Unordered使用介绍

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
2022-11-13

C++ Boost Array与Unordered怎么使用

这篇文章主要介绍“C++ Boost Array与Unordered怎么使用”,在日常操作中,相信很多人在C++ Boost Array与Unordered怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-07-04

C++BoostFlyweight库使用介绍

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
2022-12-08

ResultSet的介绍与使用

ResultSet是Java中用于表示数据库查询结果的对象,它可以对查询结果进行遍历和访问。一般来说,当使用JDBC进行数据库查询时,会返回一个ResultSet对象来表示查询结果。ResultSet对象提供了一系列方法来操作查询结果,包括
2023-09-11

python gflags介绍与使用

python gflags介绍与使用1.升级python到2.6版本以上,否则安装setuptools会失败;2.下载setuptools并安装,地址为:http://pypi.python.org/packages/2.6/s/setup
2023-01-31

C++BoostEnableIf函数使用介绍

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
2022-11-21

C++BoostMultiIndex使用详细介绍

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
2022-11-13

VueNextTick介绍与使用原理

我们对Vue中data数据的修改会导致界面对应的响应变化,而通过nextTick方法,可以在传入nextTick的回调函数中获取到变化后的DOM,讲起来可能还是有点梦幻,下面我们直接使用nextTick体验一下效果
2022-11-13

VueMixins混入介绍与使用

如果我们在每个组件中去重复定义这些属性和方法会使得项目出现代码冗余并提高了维护难度,针对这种情况官方提供了Mixins特性,这时使用Vuemixins混入有很大好处,下面就介绍下Vuemixins混入使用方法,需要的朋友参考下吧
2023-02-02

Swoole与HTTP的使用介绍

这篇文章主要讲解了“Swoole与HTTP的使用介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swoole与HTTP的使用介绍”吧!目标了解swoole的http_server的使用了解
2023-06-07

C语言中.与->的用法介绍

结构体用点,结构体指针用箭头,简单的说,就是一个快捷方式,一个语法糖,这篇文章主要介绍了C语言中.与->的区别及用法,需要的朋友可以参考下
2023-05-20

C# FileStream简单介绍和使用

FileStream 是 C# 中用于操作文件的类,它提供了一种以字节为单位读取和写入文件的功能。使用 FileStream,可以实现文件的读取、写入和修改等操作。使用 FileStream 进行文件操作的基本步骤如下:1. 创建 File
2023-08-08

MySQL游标的介绍与使用

目录定义游标的作用游标的使用游标语法条件处理创建表-test1-test2-test3测试游标过程解析定义游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行遍历数据的能力。游标也是一种
2022-12-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录