網站首頁 編程語言 正文
一、提要
庫 Boost.Bimap 基于 Boost.MultiIndex 并提供了一個無需先定義即可立即使用的容器。該容器類似于 std::map,但支持從任一側查找值。 Boost.Bimap 允許您根據訪問地圖的方式創建任意一側都可以作為關鍵點的地圖。當您訪問左側作為鍵時,右側是值,反之亦然。
二、示例
Example13.1.Usingboost::bimap
#include <boost/bimap.hpp>
#include <string>
#include <iostream>
int main()
{
typedef boost::bimap<std::string, int> bimap;
bimap animals;
animals.insert({"cat", 4});
animals.insert({"shark", 0});
animals.insert({"spider", 8});
std::cout << animals.left.count("cat") << '\n';
std::cout << animals.right.count(8) << '\n';
}
boost::bimap 定義在 boost/bimap.hpp 中,提供了兩個成員變量 left 和 right ,可用于訪問 boost::bimap 統一的兩個 std::map 類型的容器。在示例 13.1 中,left 使用 std::string 類型的鍵來訪問容器,而 right 使用 int 類型的鍵。
除了支持使用左側或右側容器訪問單個記錄外,boost::bimap 還允許您將記錄視為關系(參見示例 13.2)。
示例 13.2。訪問關系
#include <boost/bimap.hpp>
#include <string>
#include <iostream>
int main()
{
typedef boost::bimap<std::string, int> bimap;
bimap animals;
animals.insert({"cat", 4});
animals.insert({"shark", 0});
animals.insert({"spider", 8});
for (auto it = animals.begin(); it != animals.end(); ++it)
std::cout << it->left << " has " << it->right << " legs\n";
}
不必使用左或右訪問記錄。通過迭代記錄,單個記錄的左右部分可通過迭代器獲得。
雖然 std::map 附帶一個名為 std::multimap 的容器,它可以使用相同的鍵存儲多條記錄,但 boost::bimap 沒有這樣的等價物。但是,這并不意味著在 boost::bimap 類型的容器中存儲具有相同鍵的多條記錄是不可能的。嚴格來說,兩個必需的模板參數指定左和右的容器類型,而不是要存儲的元素的類型。如果未指定容器類型,則默認使用容器類型 boost::bimaps::set_of。此容器與 std::map 一樣,僅接受具有唯一鍵的記錄。
示例 13.3。顯式使用 boost::bimaps::set_of
#include <boost/bimap.hpp>
#include <string>
#include <iostream>
int main()
{
typedef boost::bimap<boost::bimaps::set_of<std::string>,
boost::bimaps::set_of<int>> bimap;
bimap animals;
animals.insert({"cat", 4});
animals.insert({"shark", 0});
animals.insert({"spider", 8});
std::cout << animals.left.count("spider") << '\n';
std::cout << animals.right.count(8) << '\n';
}
示例 13.3 指定了 boost::bimaps::set_of。
除了 boost::bimaps::set_of 之外的其他容器類型可用于自定義 boost::bimap。
示例 13.4。使用 boost::bimaps::multiset_of 允許重復
#include <boost/bimap.hpp>
#include <boost/bimap/multiset_of.hpp>
#include <string>
#include <iostream>
int main()
{
typedef boost::bimap<boost::bimaps::set_of<std::string>,
boost::bimaps::multiset_of<int>> bimap;
bimap animals;
animals.insert({"cat", 4});
animals.insert({"shark", 0});
animals.insert({"dog", 4});
std::cout << animals.left.count("dog") << '\n';
std::cout << animals.right.count(4) << '\n';
}
Example13.4
示例 13.4 使用容器類型 boost::bimaps::multiset_of,它在 boost/bimap/multiset_of.hpp 中定義。它的工作方式類似于 boost::bimaps::set_of,除了鍵不需要是唯一的。示例 13.4 將在搜索有四條腿的動物時成功顯示 2。
因為 boost::bimaps::set_of 默認用于 boost::bimap 類型的容器,所以不需要顯式包含頭文件 boost/bimap/set_of.hpp。但是,當使用其他容器類型時,必須包含相應的頭文件。
除了上面顯示的類之外,Boost.Bimap 還提供以下類:boost::bimaps::unordered_set_of、boost::bimaps::unordered_multiset_of、boost::bimaps::list_of、boost::bimaps::vector_of 和 boost: :bimaps::unconstrained_set_of。除了 boost::bimaps::unconstrained_set_of,所有其他容器類型都像標準庫中的對應容器一樣運行。
示例 13.5。使用 boost::bimaps::unconstrained_set_of 禁用一側
#include <boost/bimap.hpp>
#include <boost/bimap/unconstrained_set_of.hpp>
#include <boost/bimap/support/lambda.hpp>
#include <string>
#include <iostream>
int main()
{
typedef boost::bimap<std::string,
boost::bimaps::unconstrained_set_of<int>> bimap;
bimap animals;
animals.insert({"cat", 4});
animals.insert({"shark", 0});
animals.insert({"spider", 8});
auto it = animals.left.find("cat");
animals.left.modify_key(it, boost::bimaps::_key = "dog");
std::cout << it->first << '\n';
}
boost::bimaps::unconstrained_set_of 可用于禁用 boost::bimap 的一側。在示例 13.5 中,boost::bimap 的行為類似于 std::map。您無法訪問通過腿搜索動物的權利。
示例 13.5 說明了為什么首選 boost::bimap 而不是 std::map 的另一個原因。由于 Boost.Bimap 基于 Boost.MultiIndex,因此 Boost.MultiIndex 的成員函數可用。示例 13.5 使用 modify_key() 修改密鑰——這是 std::map 無法實現的。
注意密鑰是如何修改的。使用 boost::bimaps::_key 為當前鍵分配一個新值,這是一個在 boost/bimap/support/lambda.hpp 中定義的占位符。
boost/bimap/support/lambda.hpp 還定義了 boost::bimaps::_data。調用成員函數 modify_data() 時,boost::bimaps::_data 可用于修改 boost::bimap 類型容器中的值。
練習
使用 Boost.Bimap 實現類animals_container:
#include <boost/optional.hpp>
#include <string>
#include <vector>
#include <iostream>
struct animal
{
std::string name;
int legs;
animal(std::string n, int l) : name(n), legs(l) {}
};
class animals_container
{
public:
void add(animal a)
{
// TODO: Implement this member function.
}
boost::optional<animal> find_by_name(const std::string &name) const
{
// TODO: Implement this member function.
return {};
}
std::vector<animal> find_by_legs(int from, int to) const
{
// TODO: Implement this member function.
return {};
}
};
int main()
{
animals_container animals;
animals.add({ "cat", 4 });
animals.add({ "ant", 6 });
animals.add({ "spider", 8 });
animals.add({ "shark", 0 });
auto shark = animals.find_by_name("shark");
if (shark)
std::cout << "shark has " << shark->legs << " legs\n";
auto animals_with_4_to_6_legs = animals.find_by_legs(4, 7);
for (auto animal : animals_with_4_to_6_legs)
std::cout << animal.name << " has " << animal.legs << " legs\n";
}
原文鏈接:https://yamagota.blog.csdn.net/article/details/127406011
相關推薦
- 2022-08-15 數據結構之鏈式棧的實現與簡單運用
- 2022-08-02 python機器學習Logistic回歸原理推導_python
- 2022-09-27 C#中的const和readonly關鍵字詳解_C#教程
- 2022-05-25 Python中PyAutoGUI幫助文檔(推薦!)_python
- 2022-09-15 C#?彈出窗口show()和showdialog()的兩種方式_C#教程
- 2023-12-16 SpringBoot之自定義Starter
- 2023-01-14 詳解C#如何實現屏幕放大和取色功能_C#教程
- 2023-01-17 Golang排序和查找使用方法介紹_Golang
- 最近更新
-
- 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同步修改后的遠程分支