亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ Boost Utility超詳細(xì)講解

 更新時(shí)間:2022年12月08日 11:23:11   作者:無水先生  
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)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱

一、說明

Boost.Utility 庫(kù)是雜項(xiàng)、有用的類和函數(shù)的集合,它們太小而無法在獨(dú)立庫(kù)中維護(hù)。雖然實(shí)用程序很小并且可以快速學(xué)習(xí),但它們完全無關(guān)。與其他章節(jié)中的示例不同,此處的代碼示例不是相互構(gòu)建的,因?yàn)樗鼈兪仟?dú)立的實(shí)用程序。

雖然大多數(shù)實(shí)用程序都在 boost/utility.hpp 中定義,但有些實(shí)用程序有自己的頭文件。以下示例包括所介紹的實(shí)用程序的相應(yīng)頭文件。

二、Boost.Utility庫(kù)示例和代碼

示例 69.1。使用 boost::checked_delete()

#include <boost/checked_delete.hpp>
#include <boost/intrusive/list.hpp>
#include <string>
#include <utility>
#include <iostream>
struct animal : public boost::intrusive::list_base_hook<>
{
  std::string name_;
  int legs_;
 
  animal(std::string name, int legs) : name_{std::move(name)},
    legs_{legs} {}
};
int main()
{
  animal *a = new animal{"cat", 4};
  typedef boost::intrusive::list<animal> animal_list;
  animal_list al;
  al.push_back(*a);
  al.pop_back_and_dispose(boost::checked_delete<animal>);
  std::cout << al.size() << '\n';
}

Example 69.1

示例 69.1 將函數(shù) boost::checked_delete() 作為參數(shù)傳遞給成員函數(shù) pop_back_and_dispose(),該函數(shù)由 Boost.Intrusive 的類 boost::intrusive::list 提供。 boost::intrusive::list 和 pop_back_and_dispose() 在第 18 章中介紹,而 boost::checked_delete() 由 Boost.Utility 提供并在 boost/checked_delete.hpp 中定義。

boost::checked_delete() 期望作為其唯一參數(shù)的指針指向?qū)⒈?delete 刪除的對(duì)象。因?yàn)?pop_back_and_dispose() 需要一個(gè)函數(shù)來銷毀相應(yīng)的對(duì)象,所以傳入 boost::checked_delete() 是有意義的——這樣,您就不需要定義類似的函數(shù)。

與 delete 不同,boost::checked_delete() 確保要銷毀的對(duì)象的類型是完整的。 delete 將接受指向具有不完整類型的對(duì)象的指針。雖然這涉及您通??梢院雎缘?C++ 標(biāo)準(zhǔn)細(xì)節(jié),但您應(yīng)該注意 boost::checked_delete() 與調(diào)用 delete 并不完全相同,因?yàn)樗鼘?duì)其參數(shù)提出了更高的要求。

Boost.Utility 還提供了 boost::checked_array_delete(),可用于銷毀數(shù)組。它調(diào)用 delete[] 而不是 delete。

此外,boost::checked_deleter 和 boost::checked_array_deleter 這兩個(gè)類可用于創(chuàng)建行為分別類似于 boost::checked_delete() 和 boost::checked_array_delete() 的函數(shù)對(duì)象。

示例 69.2。使用 BOOST_CURRENT_FUNCTION

#include <boost/current_function.hpp>
#include <iostream>
int main()
{
  const char *funcname = BOOST_CURRENT_FUNCTION;
  std::cout << funcname << '\n';
}

Example 69.2

示例 69.2 使用在 boost/current_function.hpp 中定義的宏 BOOST_CURRENT_FUNCTION 將周圍函數(shù)的名稱作為字符串返回。

BOOST_CURRENT_FUNCTION 提供了一種獨(dú)立于平臺(tái)的方法來檢索函數(shù)的名稱。從 C++11 開始,您可以使用標(biāo)準(zhǔn)化宏 __func__ 做同樣的事情。在 C++11 之前,Visual C++ 和 GCC 等編譯器支持宏 __FUNCTION__ 作為擴(kuò)展。 BOOST_CURRENT_FUNCTION 使用編譯器支持的任何宏。

如果使用 Visual C++ 2013 編譯,示例 69.2 顯示 int __cdecl main(void)。

示例 69.3。使用 boost::prior() 和 boost::next()

#include <boost/next_prior.hpp>
#include <array>
#include <algorithm>
#include <iostream>
int main()
{
  std::array<char, 4> a{{'a', 'c', 'b', 'd'}};
  auto it = std::find(a.begin(), a.end(), 'b');
  auto prior = boost::prior(it, 2);
  auto next = boost::next(it);
  std::cout << *prior << '\n';
  std::cout << *it << '\n';
  std::cout << *next << '\n';
}

Boost.Utility 提供了兩個(gè)函數(shù),boost::prior() 和 boost::next(),它們返回一個(gè)相對(duì)于另一個(gè)迭代器的迭代器。在示例 69.3 中,它指向數(shù)組中的“b”,prior 指向“a”,然后指向“d”。

與 std::advance() 不同,boost::prior() 和 boost::next() 返回一個(gè)新的迭代器并且不修改傳入的迭代器。

除了迭代器之外,這兩個(gè)函數(shù)都接受第二個(gè)參數(shù),該參數(shù)指示向前或向后移動(dòng)的步數(shù)。在示例 69.3 中,迭代器在對(duì) boost::prior() 的調(diào)用中向后移動(dòng)了兩步,在對(duì) boost::next() 的調(diào)用中向前移動(dòng)了一步。

步數(shù)始終為正數(shù),即使對(duì)于向后移動(dòng)的 boost::prior() 也是如此。

要使用 boost::prior() 和 boost::next(),請(qǐng)包含頭文件 boost/next_prior.hpp。

這兩個(gè)函數(shù)都被添加到 C++11 的標(biāo)準(zhǔn)庫(kù)中,它們被稱為 std::prev() 和 std::next()。它們?cè)陬^文件迭代器中定義。

示例 69.4。使用 boost::noncopyable

#include <boost/noncopyable.hpp>
#include <string>
#include <utility>
#include <iostream>
struct animal : boost::noncopyable
{
  std::string name;
  int legs;
  animal(std::string n, int l) : name{std::move(n)}, legs{l} {}
};
void print(const animal &a)
{
  std::cout << a.name << '\n';
  std::cout << a.legs << '\n';
}
int main()
{
  animal a{"cat", 4};
  print(a);
}

Boost.Utility 提供類 boost::noncopyable,它在 boost/noncopyable.hpp 中定義。此類使復(fù)制(和移動(dòng))對(duì)象變得不可能。

通過將復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符定義為私有成員函數(shù),或者從 C++11 開始,通過使用 delete 刪除復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符,可以達(dá)到相同的效果。然而,從 boost::noncopyable 派生明確說明類的對(duì)象應(yīng)該是不可復(fù)制的。

注意:

一些開發(fā)人員更喜歡 boost::noncopyable,而其他開發(fā)人員更喜歡使用 delete 顯式刪除成員函數(shù)。您會(huì)在 Stack Overflow 等地方找到這兩種方法的論點(diǎn)。

可以編譯和執(zhí)行示例 69.4。但是,如果將 print() 函數(shù)的簽名修改為按值而不是按引用獲取動(dòng)物類型的對(duì)象,則生成的代碼將不再編譯。

示例 69.5。使用 boost::addressof()

#include <boost/utility/addressof.hpp>
#include <string>
#include <iostream>
struct animal
{
  std::string name;
  int legs;
  int operator&() const { return legs; }
};
int main()
{
  animal a{"cat", 4};
  std::cout << &a << '\n';
  std::cout << boost::addressof(a) << '\n';
}

為了檢索特定對(duì)象的地址,即使運(yùn)算符 & 已被重載,Boost.Utility 提供了函數(shù) boost::addressof(),它在 boost/utility/addressof.hpp 中定義(參見示例 69.5)。在 C++11 中,此函數(shù)成為標(biāo)準(zhǔn)庫(kù)的一部分,并在頭文件內(nèi)存中作為 std::addressof() 提供。

示例 69.6。使用 BOOST_BINARY

#include <boost/utility/binary.hpp>
#include <iostream>
int main()
{
  int i = BOOST_BINARY(1001 0001);
  std::cout << i << '\n';
  short s = BOOST_BINARY(1000 0000 0000 0000);
  std::cout << s << '\n';
}

宏 BOOST_BINARY 允許您創(chuàng)建二進(jìn)制形式的數(shù)字。標(biāo)準(zhǔn) C++ 僅支持十六進(jìn)制和八進(jìn)制形式,使用前綴 0x 和 0。C++11 引入了用戶定義文字,允許您定義自定義后綴,但在 C+ 中仍然沒有以二進(jìn)制形式使用數(shù)字的標(biāo)準(zhǔn)方法+11。

示例 69.6 顯示 145 和 -32768。 s 中存儲(chǔ)的位序列表示一個(gè)負(fù)數(shù),因?yàn)?16 位類型的 short 使用第 16 位——short 中的最高有效位——作為符號(hào)位。

BOOST_BINARY 只是提供了另一種寫數(shù)字的選項(xiàng)。因?yàn)樵?C++ 中,數(shù)字的默認(rèn)類型是 int,所以 BOOST_BINARY 也使用 int。要定義一個(gè) long 類型的數(shù)字,請(qǐng)使用宏 BOOST_BINARY_L,它生成等同于以字母 L 為后綴的數(shù)字。

Boost.Utility 包括額外的宏,例如 BOOST_BINARY_U,它初始化一個(gè)沒有符號(hào)位的變量。所有這些宏都在頭文件 boost/utility/binary.hpp 中定義。

示例 69.7。使用 boost::string_ref

#include <boost/utility/string_ref.hpp>
#include <iostream>
boost::string_ref start_at_boost(boost::string_ref s)
{
  auto idx = s.find("Boost");
  return (idx != boost::string_ref::npos) ? s.substr(idx) : "";
}
int main()
{
  boost::string_ref s = "The Boost C++ Libraries";
  std::cout << start_at_boost(s) << '\n';
}

Example 69.7

示例 69.7 引入了類 boost::string_ref,它是對(duì)僅支持讀取訪問的字符串的引用。在某種程度上,該引用可與 const std::string& 相媲美。然而,const std::string& 要求存在一個(gè) std::string 類型的對(duì)象。 boost::string_ref 也可以在沒有 std::string 的情況下使用。 boost::string_ref 的好處是,與 std::string 不同,它不需要分配內(nèi)存。

示例 69.7 在字符串中查找單詞“Boost”。如果找到,將顯示以該詞開頭的字符串。如果未找到“Boost”一詞,則會(huì)顯示一個(gè)空字符串。 main() 中字符串 s 的類型不是 std::string,而是 boost::string_ref。因此,沒有內(nèi)存分配給 new,也沒有創(chuàng)建副本。 s 直接指向文字字符串“The Boost C++ Libraries”。

start_at_boost() 的返回值類型是 boost::string_ref,而不是 std::string。該函數(shù)不返回新字符串,它返回一個(gè)引用。此引用指向參數(shù)的子字符串或空字符串。 start_at_boost() 要求原始字符串在使用 boost::string_ref 類型的引用時(shí)保持有效。如果可以保證這一點(diǎn),如示例 69.7 所示,則可以避免內(nèi)存分配。

還可以使用其他實(shí)用程序,但它們超出了本書的范圍,因?yàn)樗鼈冎饕?Boost 庫(kù)的開發(fā)人員使用或用于模板元編程。 Boost.Utility 的文檔提供了這些附加實(shí)用程序的相當(dāng)全面的概述,如果您有興趣,可以作為起點(diǎn)。

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

相關(guān)文章

  • C++利用遞歸實(shí)現(xiàn)走迷宮

    C++利用遞歸實(shí)現(xiàn)走迷宮

    這篇文章主要為大家詳細(xì)介紹了C++利用遞歸實(shí)現(xiàn)走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 淺談C++的淺拷貝出現(xiàn)的錯(cuò)誤

    淺談C++的淺拷貝出現(xiàn)的錯(cuò)誤

    下面小編就為大家?guī)硪黄獪\談C++的淺拷貝出現(xiàn)的錯(cuò)誤。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++?超詳細(xì)分析數(shù)據(jù)結(jié)構(gòu)中的時(shí)間復(fù)雜度

    C++?超詳細(xì)分析數(shù)據(jù)結(jié)構(gòu)中的時(shí)間復(fù)雜度

    時(shí)間復(fù)雜度一般指時(shí)間復(fù)雜性。?在計(jì)算機(jī)科學(xué)中,時(shí)間復(fù)雜性,又稱時(shí)間復(fù)雜度,算法的時(shí)間復(fù)雜度是一個(gè)函數(shù),它定性描述該算法的運(yùn)行時(shí)間
    2022-03-03
  • kernel利用pt?regs劫持seq?operations的遷移過程詳解

    kernel利用pt?regs劫持seq?operations的遷移過程詳解

    這篇文章主要為大家介紹了kernel利用pt_regs劫持seq_operations進(jìn)行遷移的過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • OpenCV實(shí)現(xiàn)拼接圖像的簡(jiǎn)單方法

    OpenCV實(shí)現(xiàn)拼接圖像的簡(jiǎn)單方法

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)拼接圖像的簡(jiǎn)單方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解

    C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解

    這篇文章主要為大家介紹了C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • VS2019+Opencv4.0+Win10配置詳解

    VS2019+Opencv4.0+Win10配置詳解

    這篇文章主要介紹了VS2019+Opencv4.0+Win10配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C++實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果的示例代碼

    C++實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++如何實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-01-01
  • Matlab實(shí)現(xiàn)統(tǒng)計(jì)集合中各元素出現(xiàn)次數(shù)的示例代碼

    Matlab實(shí)現(xiàn)統(tǒng)計(jì)集合中各元素出現(xiàn)次數(shù)的示例代碼

    統(tǒng)計(jì)數(shù)組中各個(gè)元素?cái)?shù)量是一個(gè)很常用的功能,本文主要為大家介紹了如何利用Matlab優(yōu)雅的統(tǒng)計(jì)集合中各元素出現(xiàn)的次數(shù),感興趣的可以了解一下
    2022-05-05
  • C++ Boost Bind庫(kù)示例分析使用

    C++ Boost Bind庫(kù)示例分析使用

    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)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11

最新評(píng)論