C++ Boost Array與Unordered使用介紹
一、提要
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)建一個與 C 數(shù)組具有相同屬性的數(shù)組。此外,boost::array 符合 C++ 容器的要求,這使得處理這樣的數(shù)組就像處理任何其他容器一樣容易。原則上,可以將 boost::array 視為容器 std::vector,但 boost::array 中的元素數(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)簡單,不需要額外解釋,因為調(diào)用的成員函數(shù)與來自 std::vector 的成員函數(shù)具有相同的含義。
三、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'; }
示例 15.2 使用 boost::unordered_map 來存儲幾種動物的名稱和腿數(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 中,動物類型的元素存儲在 boost::unordered_set 類型的容器中。由于 boost::unordered_set 的哈希函數(shù)不知道類動物,因此無法自動計算此類元素的哈希值。這就是為什么必須定義散列函數(shù)的原因——否則無法編譯示例。
要定義的哈希函數(shù)的名稱是 hash_value()。它必須期望作為其唯一參數(shù)的類型的對象應(yīng)該計算哈希值。 hash_value() 的返回值類型必須是 std::size_t。
當(dāng)必須為對象計算哈希值時,會自動調(diào)用函數(shù) hash_value()。此函數(shù)是為 Boost 庫中的各種類型定義的,包括 std::string。對于動物等用戶定義的類型,它必須由開發(fā)者定義。
通常,hash_value() 的定義相當(dāng)簡單:通過一個接一個地訪問對象的成員變量來創(chuàng)建哈希值。這是通過函數(shù) boost::hash_combine() 完成的,該函數(shù)由 Boost.Hash 提供并在 boost/functional/hash.hpp 中定義。如果使用 Boost.Unordered,則不必包含此頭文件,因為此庫中的所有容器都訪問 Boost.Hash 來計算哈希值。
除了定義 hash_value() 之外,您還需要確??梢允褂?== 比較兩個對象。這就是示例 15.3 中運算符 operator== 為動物重載的原因。
C++11 標(biāo)準(zhǔn)庫中的散列容器使用頭文件中的散列函數(shù)函數(shù)。 Boost.Unordered 的散列容器需要散列函數(shù) hash_value()。是否在 hash_value() 中使用 Boost.Hash 并不重要。 Boost.Hash 是有意義的,因為像 boost::hash_combine() 這樣的函數(shù)可以更容易地從多個成員變量逐步計算哈希值。然而,這只是 hash_value() 的一個實現(xiàn)細(xì)節(jié)。除了使用不同的散列函數(shù)之外,Boost.Unordered 的散列容器和標(biāo)準(zhǔn)庫中的散列容器基本上是等價的。
到此這篇關(guān)于C++ Boost Array與Unordered使用介紹的文章就介紹到這了,更多相關(guān)C++ Array與Unordered內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實現(xiàn)簡易學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06Cocos2d-x學(xué)習(xí)筆記之Hello World源碼分析
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之Hello World源碼分析,接上一篇內(nèi)容,本文著重分析源碼文件,需要的朋友可以參考下2014-09-09C語言數(shù)據(jù)結(jié)構(gòu)線性表教程示例詳解
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)線性表的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-02-02C++數(shù)據(jù)結(jié)構(gòu)模板進階的多方面分析
今天我要給大家介紹C++中的模板更深的一些知識。有關(guān)于非類型的模板參數(shù)和模板特化的一些知識,感興趣的朋友快來看看吧2022-02-02C++實現(xiàn)LeetCode(82.移除有序鏈表中的重復(fù)項之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(82.移除有序鏈表中的重復(fù)項之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07如何使用C語言實現(xiàn)平衡二叉樹數(shù)據(jù)結(jié)構(gòu)算法
對于判斷是否為平衡二叉樹而言,我們需要知道以下特性:是一個二叉樹也是一個二叉排序樹該樹的每個結(jié)點上的(深度)左子樹 - 右子樹的值為平衡因子(BF(Balance Factor))該樹的每一個節(jié)點的左子樹和右子樹的高度至多等于1(平衡因子只可能是-1,0,1)2021-08-08C++11 線程同步接口std::condition_variable和std::future的簡單使用示例詳
本文介紹了std::condition_variable和std::future在C++中的應(yīng)用,用于線程間的同步和異步執(zhí)行,通過示例代碼,展示了如何使用std::condition_variable的wait和notify接口進行線程間同步2024-09-09