" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Boost Array與Unordered使用介紹

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

一、提要

Boost.Array 庫在 boost/array.hpp 中定義了類模板 boost::array。 boost::array 與 std::array 類似,后者是使用 C++11 添加到標(biāo)準(zhǔn)庫中的。如果您使用 C++11 開發(fā)環(huán)境,則可以忽略 boost::array。

二、示例boost::array

使用 boost::array,可以創(chuàng)建一個(gè)與 C 數(shù)組具有相同屬性的數(shù)組。此外,boost::array 符合 C++ 容器的要求,這使得處理這樣的數(shù)組就像處理任何其他容器一樣容易。原則上,可以將 boost::array 視為容器 std::vector,但 boost::array 中的元素?cái)?shù)量是恒定的。

示例 14.1。 boost::array 的各種成員函數(shù)

#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 相當(dāng)簡單,不需要額外解釋,因?yàn)檎{(diào)用的成員函數(shù)與來自 std::vector 的成員函數(shù)具有相同的含義。

三、Boost.Unordered

Boost.Unordered

Boost.Unordered 提供類 boost::unordered_set、boost::unordered_multiset、boost::unordered_map 和 boost::unordered_multimap。這些類與使用 C++11 添加到標(biāo)準(zhǔn)庫中的散列容器相同。因此,如果您使用支持 C++11 的開發(fā)環(huán)境,則可以忽略 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 沒有區(qū)別。

示例 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 來存儲(chǔ)幾種動(dòng)物的名稱和腿數(shù)。再一次,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 中,動(dòng)物類型的元素存儲(chǔ)在 boost::unordered_set 類型的容器中。由于 boost::unordered_set 的哈希函數(shù)不知道類動(dòng)物,因此無法自動(dòng)計(jì)算此類元素的哈希值。這就是為什么必須定義散列函數(shù)的原因——否則無法編譯示例。

要定義的哈希函數(shù)的名稱是 hash_value()。它必須期望作為其唯一參數(shù)的類型的對(duì)象應(yīng)該計(jì)算哈希值。 hash_value() 的返回值類型必須是 std::size_t。

當(dāng)必須為對(duì)象計(jì)算哈希值時(shí),會(huì)自動(dòng)調(diào)用函數(shù) hash_value()。此函數(shù)是為 Boost 庫中的各種類型定義的,包括 std::string。對(duì)于動(dòng)物等用戶定義的類型,它必須由開發(fā)者定義。

通常,hash_value() 的定義相當(dāng)簡單:通過一個(gè)接一個(gè)地訪問對(duì)象的成員變量來創(chuàng)建哈希值。這是通過函數(shù) boost::hash_combine() 完成的,該函數(shù)由 Boost.Hash 提供并在 boost/functional/hash.hpp 中定義。如果使用 Boost.Unordered,則不必包含此頭文件,因?yàn)榇藥熘械乃腥萜鞫荚L問 Boost.Hash 來計(jì)算哈希值。

除了定義 hash_value() 之外,您還需要確??梢允褂?== 比較兩個(gè)對(duì)象。這就是示例 15.3 中運(yùn)算符 operator== 為動(dòng)物重載的原因。

C++11 標(biāo)準(zhǔn)庫中的散列容器使用頭文件中的散列函數(shù)函數(shù)。 Boost.Unordered 的散列容器需要散列函數(shù) hash_value()。是否在 hash_value() 中使用 Boost.Hash 并不重要。 Boost.Hash 是有意義的,因?yàn)橄?boost::hash_combine() 這樣的函數(shù)可以更容易地從多個(gè)成員變量逐步計(jì)算哈希值。然而,這只是 hash_value() 的一個(gè)實(shí)現(xiàn)細(xì)節(jié)。除了使用不同的散列函數(shù)之外,Boost.Unordered 的散列容器和標(biāo)準(zhǔn)庫中的散列容器基本上是等價(jià)的。

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

相關(guān)文章

  • C語言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn)

    C語言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn)

    scandir?函數(shù)用于列舉指定目錄下的文件列表,本文主要介紹了C語言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • C++中queue容器的具體使用

    C++中queue容器的具體使用

    本文主要介紹了C++中queue容器的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C++實(shí)現(xiàn)圖書館管理系統(tǒng)

    C++實(shí)現(xiàn)圖書館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言中l(wèi)seek()函數(shù)和fseek()函數(shù)的使用詳解

    C語言中l(wèi)seek()函數(shù)和fseek()函數(shù)的使用詳解

    這篇文章主要介紹了C語言中l(wèi)seek()函數(shù)和fseek()函數(shù)的使用詳解,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C++使用windwos?api實(shí)現(xiàn)獲取計(jì)算機(jī)基本信息

    C++使用windwos?api實(shí)現(xiàn)獲取計(jì)算機(jī)基本信息

    這篇文章主要為大家詳細(xì)介紹了C++如何使用windwos?api實(shí)現(xiàn)獲取windwos計(jì)算機(jī)的基本信息,包括計(jì)算機(jī)名稱、操作系統(tǒng)版本、處理器信息等,需要的可以參考一下
    2023-04-04
  • C語言由淺入深講解文件的操作下篇

    C語言由淺入深講解文件的操作下篇

    C語言具有操作文件的能力,比如打開文件、讀取和追加數(shù)據(jù)、插入和刪除數(shù)據(jù)、關(guān)閉文件、刪除文件等。與其他編程語言相比,C語言文件操作的接口相當(dāng)簡單和易學(xué)
    2022-04-04
  • VS2022 Git提交代碼的實(shí)現(xiàn)

    VS2022 Git提交代碼的實(shí)現(xiàn)

    本文主要介紹了VS2022 Git提交代碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語言全方位講解指針與地址和數(shù)組函數(shù)堆空間的關(guān)系

    C語言全方位講解指針與地址和數(shù)組函數(shù)堆空間的關(guān)系

    指針是C語言中一個(gè)非常重要的概念,也是C語言的特色之一。使用指針可以對(duì)復(fù)雜數(shù)據(jù)進(jìn)行處理,能對(duì)計(jì)算機(jī)的內(nèi)存分配進(jìn)行控制,在函數(shù)調(diào)用中使用指針還可以返回多個(gè)值
    2022-04-04
  • 從匯編看c++函數(shù)的默認(rèn)參數(shù)的使用說明

    從匯編看c++函數(shù)的默認(rèn)參數(shù)的使用說明

    本篇文章介紹了,在c++中函數(shù)的默認(rèn)參數(shù)的使用說明分析。需要的朋友參考下
    2013-05-05
  • C++中多線程的執(zhí)行順序如你預(yù)期嗎

    C++中多線程的執(zhí)行順序如你預(yù)期嗎

    這篇文章主要為大家詳細(xì)介紹一下C++中多線程的執(zhí)行順序的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++多線程有一定幫助,需要的可以參考一下
    2022-10-10

最新評(píng)論

红安县| 青铜峡市| 大洼县| 儋州市| 泽普县| 璧山县| 富宁县| 泸州市| 阿克陶县| 慈溪市| 新津县| 青川县| 清原| 灵丘县| 湟源县| 靖远县| 海原县| 和田县| 永定县| 景泰县| 错那县| 永昌县| 汪清县| 兴山县| 柳林县| 太湖县| 阿拉尔市| 镇远县| 葵青区| 车险| 康保县| 亳州市| 全椒县| 五原县| 崇州市| 禹城市| 闽侯县| 米脂县| 洪泽县| 重庆市| 宁武县|