iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++BoostArray与Unordered使用介绍
  • 805
分享到

C++BoostArray与Unordered使用介绍

C++Array与UnorderedC++BoostArrayC++BoostUnordered 2022-11-13 19:11:54 805人浏览 泡泡鱼
摘要

目录一、提要二、示例boost::array三、Boost.Unordered一、提要 Boost.Array 库在 boost/array.hpp 中定义了类模板 boost::a

一、提要

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

--结束END--

本文标题: C++BoostArray与Unordered使用介绍

本文链接: https://www.lsjlt.com/news/170814.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C++BoostArray与Unordered使用介绍
    目录一、提要二、示例boost::array三、Boost.Unordered一、提要 Boost.Array 库在 boost/array.hpp 中定义了类模板 boost::a...
    99+
    2022-11-13
    C++ Array与Unordered C++ Boost Array C++ Boost Unordered
  • C++ Boost Array与Unordered怎么使用
    这篇文章主要介绍“C++ Boost Array与Unordered怎么使用”,在日常操作中,相信很多人在C++ Boost Array与Unordered怎么使用问题上存在疑惑,小编查阅了各式资料,...
    99+
    2023-07-04
  • C/C++指针介绍与使用详解
    目录什么是指针定义指针变量间接引用指针常or常常指向指针的指针指针与数组指针的运算堆内存分配C语言C++语言指针与函数数组名作为函数的入口参数函数名作为参数传入其他函数使用指针修改函...
    99+
    2024-04-02
  • C++移动语义介绍与使用讲解
    目录引入移动语义std::move引入移动语义 为了能够理解移动语义的目的,我们先从整成的一个类进行示范,示例如下: class TestClass { public: Te...
    99+
    2024-04-02
  • C++BoostFlyweight库使用介绍
    目录一、说明二、库Boost.Flyweight炼习一、说明 以下库用于设计模式。 Boost.Flyweight 有助于在程序中使用许多相同的对象并且需要减少内存消耗的情况。Boo...
    99+
    2022-12-08
    C++ Boost Flyweight C++ Flyweight库
  • python gflags介绍与使用
    python gflags介绍与使用 1.升级python到2.6版本以上,否则安装setuptools会失败; 2.下载setuptools并安装,地址为:http://pypi.python.org/packages/2.6/...
    99+
    2023-01-31
    python gflags
  • ResultSet的介绍与使用
    ResultSet是Java中用于表示数据库查询结果的对象,它可以对查询结果进行遍历和访问。一般来说,当使用JDBC进行数据库查询时...
    99+
    2023-09-11
    ResultSet
  • C++BoostEnableIf函数使用介绍
    目录一、说明二、Boost.EnableIf的示例练习一、说明 Boost.EnableIf Boost.Enable If 可以禁用重载函数模板或专用类模板。禁用意味着编译器忽略相...
    99+
    2022-11-21
    C++ Boost EnableIf C++ EnableIf函数
  • C++BoostMultiIndex使用详细介绍
    目录一、关于BOOST的容器二、Boost.MultiIndex练习一、关于BOOST的容器 容器是 C++ 中最有用的数据结构之一。标准库提供了许多容器,而 Boost 库提供的更...
    99+
    2022-11-13
    C++ Boost MultiIndex C++ MultiIndex
  • VueMixins混入介绍与使用
    目录混入(Mixins)介绍Mixins使用1,建立js文件2,mixins.js代码3,页面局部混入全局混入混入(Mixins)介绍 混入 (mixin) 提供了一种非常灵活的方式...
    99+
    2023-02-02
    Vue Mixins混入 Vue Mixins
  • VueNextTick介绍与使用原理
    目录一、NextTick是什么定义理解为什么要有nexttick二、使用场景三、实现原理一、NextTick是什么 定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后...
    99+
    2022-11-13
    Vue NextTick Vue NextTick的作用
  • Swoole与HTTP的使用介绍
    这篇文章主要讲解了“Swoole与HTTP的使用介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swoole与HTTP的使用介绍”吧!目标了解swoole的http_server的使用了解...
    99+
    2023-06-07
  • 【Python】pyinstaller的介绍与使用
    一、 概述 1、 简介 pyinstaller是一个第三方库,它能够在Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可...
    99+
    2023-09-01
    python
  • Python:jieba库的介绍与使用
    前言: jieba是优秀的中文分词第三方库,由于中文文本之间每个汉字都是连续书写的,我们需要通过特定的手段来获得其中的每个词组,这种手段叫做分词,我们可以通过jieba库来完成这个过程。 目录: 一、jieba库基本介绍 (1)jieba...
    99+
    2023-09-22
    python
  • C语言中.与->的用法介绍
    目录(一)基础(二)例子(三)总结(一)基础 结构体用点,结构体指针用箭头。 a->b 的含义是 (*a).b 。  现代的标...
    99+
    2023-05-20
    C语言中.与->的区别 C语言->用法
  • C++构建函数使用介绍
    构造函数概念: 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次(创建对象) 作...
    99+
    2024-04-02
  • C# FileStream简单介绍和使用
    FileStream 是 C# 中用于操作文件的类,它提供了一种以字节为单位读取和写入文件的功能。使用 FileStream,可以实...
    99+
    2023-08-08
    C#
  • C++lambda表达式使用介绍
    目录前言lambda表达式格式一些语法走进底层前言 C++98中的一个例子。 #include <iostream> #include <vector> #i...
    99+
    2024-04-02
  • React Fragment介绍与使用详解
    目录前言 Fragments出现动机 React Fragment介绍与使用 <React.Fragment> 与 <>区别 前言 在向 DOM 树批量添加...
    99+
    2024-04-02
  • MySQL游标的介绍与使用
    目录定义游标的作用游标的使用游标语法条件处理创建表-test1-test2-test3测试游标过程解析定义 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行遍历数据的...
    99+
    2022-12-16
    MySQL游标 MySQL游标是什么
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作