欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ Boost Optional示例超詳細(xì)講解

 更新時(shí)間:2022年11月09日 09:34:08   作者:無(wú)水先生  
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱

一、概述

數(shù)據(jù)結(jié)構(gòu)類(lèi)似于容器,因?yàn)樗鼈兛梢源鎯?chǔ)一個(gè)或多個(gè)元素。但是,它們與容器不同,因?yàn)樗鼈儾恢С秩萜魍ǔVС值牟僮鳌@?,使用本部分介紹的數(shù)據(jù)結(jié)構(gòu),不可能在一次迭代中訪問(wèn)所有元素。

Boost.Optional 可以很容易地標(biāo)記可選的返回值。使用 Boost.Optional 創(chuàng)建的對(duì)象要么是空的,要么包含單個(gè)元素。使用 Boost.Optional,您無(wú)需使用空指針或 -1 等特殊值來(lái)指示函數(shù)可能沒(méi)有返回值。

  • Boost.Tuple 提供了 boost::tuple,這是一個(gè)自 C++11 以來(lái)一直是標(biāo)準(zhǔn)庫(kù)的一部分的類(lèi)。
  • Boost.Any 和 Boost.Variant 允許您創(chuàng)建可以存儲(chǔ)不同類(lèi)型值的變量。 Boost.Any 支持任意類(lèi)型,Boost.Variant 允許您將需要支持的類(lèi)型作為模板參數(shù)傳遞。
  • Boost.PropertyTree 提供了一個(gè)樹(shù)狀的數(shù)據(jù)結(jié)構(gòu)。該庫(kù)通常用于幫助管理配置數(shù)據(jù)。數(shù)據(jù)還可以以 JSON 等格式寫(xiě)入文件或從文件中加載。
  • Boost.DynamicBitset 提供了一個(gè)類(lèi)似于 std::bitset 但在運(yùn)行時(shí)配置的類(lèi)。
  • Boost.Tribool 提供了一種類(lèi)似于 bool 的數(shù)據(jù)類(lèi)型,支持三種狀態(tài)。
  • Boost.CompressedPair 定義了 boost::compressed_pa??ir 類(lèi),可以替代 std::pair。該類(lèi)支持所謂的空基類(lèi)優(yōu)化。

二、Boost.Optional

庫(kù) Boost.Optional 提供類(lèi) boost::optional,可用于可選返回值。這些是函數(shù)的返回值,可能并不總是返回結(jié)果。示例 21.1 說(shuō)明了在沒(méi)有 Boost.Optional 的情況下通常如何實(shí)現(xiàn)可選返回值。

示例 21.1。表示可選返回值的特殊值

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
int get_even_random_number()
{
  int i = std::rand();
  return (i % 2 == 0) ? i : -1;
}
int main()
{
  std::srand(static_cast<unsigned int>(std::time(0)));
  int i = get_even_random_number();
  if (i != -1)
    std::cout << std::sqrt(static_cast<float>(i)) << '\n';
}

示例 21.1 使用函數(shù) get_even_random_number(),它應(yīng)該返回一個(gè)偶數(shù)隨機(jī)數(shù)。它通過(guò)調(diào)用標(biāo)準(zhǔn)庫(kù)中的函數(shù) std::rand() 以一種相當(dāng)幼稚的方式做到這一點(diǎn)。如果 std::rand() 生成偶數(shù)隨機(jī)數(shù),則該數(shù)字由 get_even_random_number() 返回。如果生成的隨機(jī)數(shù)是奇數(shù),則返回-1。

在此示例中,-1 表示無(wú)法生成偶數(shù)隨機(jī)數(shù)。因此,get_even_random_number() 不能保證返回偶數(shù)隨機(jī)數(shù)。返回值是可選的。

許多函數(shù)使用 -1 之類(lèi)的特殊值來(lái)表示不能返回任何結(jié)果。例如,如果找不到子字符串,std::string 類(lèi)的成員函數(shù) find() 將返回特殊值 std::string::npos。返回值為指針的函數(shù)通常返回 0 表示不存在結(jié)果。

Boost.Optional 提供了 boost::optional,這使得可以清楚地標(biāo)記可選的返回值。

示例 21.2。帶有 boost::optional 的可選返回值

#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using boost::optional;
optional<int> get_even_random_number()
{
  int i = std::rand();
  return (i % 2 == 0) ? i : optional<int>{};
}
int main()
{
  std::srand(static_cast<unsigned int>(std::time(0)));
  optional<int> i = get_even_random_number();
  if (i)
    std::cout << std::sqrt(static_cast<float>(*i)) << '\n';
}

在示例 21.2 中,get_even_random_number() 的返回值具有一個(gè)新類(lèi)型,boost::optional<int>。 boost::optional 是一個(gè)模板,必須使用返回值的實(shí)際類(lèi)型進(jìn)行實(shí)例化。 boost/optional.hpp 必須包含在 boost::optional 中。

如果 get_even_random_number() 生成偶數(shù)隨機(jī)數(shù),則直接返回該值,并自動(dòng)包裝在類(lèi)型為 boost::optional<int> 的對(duì)象中,因?yàn)?boost::optional 提供了一個(gè)非排他的構(gòu)造函數(shù)。如果 get_even_random_number() 不生成偶數(shù)隨機(jī)數(shù),則返回 boost::optional<int> 類(lèi)型的空對(duì)象。返回值是通過(guò)調(diào)用默認(rèn)構(gòu)造函數(shù)創(chuàng)建的。

main() 檢查 i 是否為空。如果它不為空,則使用 operator* 訪問(wèn)存儲(chǔ)在 i 中的數(shù)字。 boost::optional 似乎像指針一樣工作。但是,您不應(yīng)將 boost::optional 視為指針,因?yàn)槔纾琤oost::optional 中的值由復(fù)制構(gòu)造函數(shù)復(fù)制,而指針不會(huì)復(fù)制其指向的值。

示例 21.3。 boost::optional 的其他有用的成員函數(shù)

#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using boost::optional;
optional<int> get_even_random_number()
{
  int i = std::rand();
  return optional<int>{i % 2 == 0, i};
}
int main()
{
  std::srand(static_cast<unsigned int>(std::time(0)));
  optional<int> i = get_even_random_number();
  if (i.is_initialized())
    std::cout << std::sqrt(static_cast<float>(i.get())) << '\n';
}

eExample21.3e

示例 21.3 介紹了 boost::optional 的其他有用的成員函數(shù)。此類(lèi)提供了一個(gè)特殊的構(gòu)造函數(shù),它將條件作為第一個(gè)參數(shù)。如果條件為真,則使用第二個(gè)參數(shù)初始化 boost::optional 類(lèi)型的對(duì)象。如果條件為假,則會(huì)創(chuàng)建一個(gè) boost::optional 類(lèi)型的空對(duì)象。示例 21.3 在函數(shù) get_even_random_number() 中使用此構(gòu)造函數(shù)。

使用 is_initialized() 您可以檢查 boost::optional 類(lèi)型的對(duì)象是否不為空。 Boost.Optional 涉及已初始化和未初始化的對(duì)象——因此,成員函數(shù)的名稱為 is_initialized()。成員函數(shù) get() 等效于 operator*。

示例 21.4。 Boost.Optional 的各種輔助函數(shù)

#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace boost;
optional<int> get_even_random_number()
{
  int i = std::rand();
  return make_optional(i % 2 == 0, i);
}
int main()
{
  std::srand(static_cast<unsigned int>(std::time(0)));
  optional<int> i = get_even_random_number();
  double d = get_optional_value_or(i, 0);
  std::cout << std::sqrt(d) << '\n';
}

Boost.Optional 提供獨(dú)立的輔助函數(shù),例如 boost::make_optional() 和 boost::get_optional_value_or()(參見(jiàn)示例 21.4)??梢哉{(diào)用 boost::make_optional() 來(lái)創(chuàng)建 boost::optional 類(lèi)型的對(duì)象。如果您希望在 boost::optional 為空時(shí)返回默認(rèn)值,您可以調(diào)用 boost::get_optional_value_or()。

函數(shù) boost::get_optional_value_or() 也作為 boost::optional 的成員函數(shù)提供。它被稱為 get_value_or()。

除了 boost/optional/optional_io.hpp 之外,Boost.Optional 還提供了一個(gè)帶有重載流運(yùn)算符的頭文件,讓您可以將 boost::optional 類(lèi)型的對(duì)象寫(xiě)入標(biāo)準(zhǔn)輸出等。

參考文:

Chapter21.Boost.Optional (theboostcpplibraries.com)

到此這篇關(guān)于C++ Boost Optional示例超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost Optional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++學(xué)習(xí)之命名空間詳解

    C++學(xué)習(xí)之命名空間詳解

    C++中,命名空間(namespace)是一個(gè)重要的概念。命名空間可以為函數(shù)、變量、類(lèi)等定義作用域,避免與其他定義的名稱發(fā)生沖突。下面我們就來(lái)了解一下如何使用C++命名空間,以及一些常見(jiàn)的操作吧
    2023-04-04
  • C語(yǔ)言庫(kù)函數(shù)strcpy的使用及模擬實(shí)現(xiàn)

    C語(yǔ)言庫(kù)函數(shù)strcpy的使用及模擬實(shí)現(xiàn)

    本文主要介紹了C語(yǔ)言庫(kù)函數(shù)strcpy的使用及模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • C/C++最短路徑算法之迪杰斯特拉Dijkstra的實(shí)現(xiàn)詳解

    C/C++最短路徑算法之迪杰斯特拉Dijkstra的實(shí)現(xiàn)詳解

    Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文將詳解該算法的圖解與實(shí)現(xiàn),需要的可以參考一下
    2022-07-07
  • 深度揭秘C++面向?qū)ο缶幊讨欣^承的核心概念

    深度揭秘C++面向?qū)ο缶幊讨欣^承的核心概念

    我們知道C語(yǔ)言是面向過(guò)程的編程語(yǔ)言,C++在C語(yǔ)言的基礎(chǔ)上進(jìn)化出了面向?qū)ο蟮哪P?,而繼承就是面向?qū)ο蟮闹匾獙傩裕旅婢妥屝【巵?lái)和大家詳細(xì)講講吧
    2023-07-07
  • C++/GoLang如何實(shí)現(xiàn)自底向上的歸并排序

    C++/GoLang如何實(shí)現(xiàn)自底向上的歸并排序

    這篇文章主要給大家介紹了關(guān)于C++/GoLang如何實(shí)現(xiàn)自底向上的歸并排序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 純C語(yǔ)言:遞歸二進(jìn)制轉(zhuǎn)十進(jìn)制源碼分享

    純C語(yǔ)言:遞歸二進(jìn)制轉(zhuǎn)十進(jìn)制源碼分享

    這篇文章主要介紹了純C語(yǔ)言:遞歸二進(jìn)制轉(zhuǎn)十進(jìn)制源碼,有需要的朋友可以參考一下
    2014-01-01
  • C++鏈表節(jié)點(diǎn)的添加和刪除介紹

    C++鏈表節(jié)點(diǎn)的添加和刪除介紹

    大家好,本篇文章主要講的是C++鏈表節(jié)點(diǎn)的添加和刪除介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 匯編語(yǔ)言常見(jiàn)錯(cuò)誤信息中文注解

    匯編語(yǔ)言常見(jiàn)錯(cuò)誤信息中文注解

    這篇文章主要介紹了匯編語(yǔ)言常見(jiàn)錯(cuò)誤信息中文注解,本文收集大部分匯編中常見(jiàn)錯(cuò)誤信息及對(duì)應(yīng)的中文注解,需要的朋友可以參考下
    2014-09-09
  • 用C語(yǔ)言編寫(xiě)推箱子游戲

    用C語(yǔ)言編寫(xiě)推箱子游戲

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言編寫(xiě)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++使用jsoncpp庫(kù)解析Json

    C++使用jsoncpp庫(kù)解析Json

    對(duì)json的解析操作是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到的一個(gè)需求,下面這篇文章主要給大家介紹了關(guān)于C++使用jsoncpp庫(kù)解析Json的相關(guān)資料,需要的朋友可以參考下
    2021-06-06

最新評(píng)論