網站首頁 編程語言 正文
一、提要
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 的散列容器和標準庫中的散列容器基本上是等價的。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127412518
相關推薦
- 2023-02-09 C++開發protobuf動態解析工具_C 語言
- 2023-04-27 React中state屬性和生命周期的使用_React
- 2023-07-26 vite項目中處理各種靜態資源的引入方式介紹
- 2022-11-22 Python?Counting?Bloom?Filter原理與實現詳細介紹_python
- 2022-07-26 Python中迭代器與生成器的用法_python
- 2022-09-17 golang構建工具Makefile使用詳解_Golang
- 2022-10-12 pandas學習之df.set_index的具體使用_python
- 2022-04-16 C語言數據結構之二叉鏈表創建二叉樹_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支