網站首頁 編程語言 正文
一、提要
在 C++11 中,Boost.PointerContainer是另一個智能指針,一般是用來生成集合數據的,本文闡述這種指針的特點和用法。
二、智能指針Boost.PointerContainer
庫 Boost.PointerContainer 提供專門用于管理動態分配對象的容器。例如,在 C++11 中,您可以使用 std::vector<std::unique_ptr<int>> 創建這樣的容器。但是,來自 Boost.PointerContainer 的容器可以提供一些額外的便利。
Example2.1.Usingboost::ptr_vector
#include <boost/ptr_container/ptr_vector.hpp> #include <iostream> int main() { boost::ptr_vector<int> v; v.push_back(new int{1}); v.push_back(new int{2}); std::cout << v.back() << '\n'; }
類 boost::ptr_vector 基本上像 std::vector<std::unique_ptr<int>> 一樣工作(參見示例 2.1)。但是,因為 boost::ptr_vector 知道它存儲動態分配的對象,所以像 back() 這樣的成員函數會返回對動態分配對象的引用,而不是指針。因此,該示例將 2 寫入標準輸出。
例子1.boost::ptr_set
以直觀正確的順序
#include <boost/ptr_container/ptr_set.hpp> #include <boost/ptr_container/indirect_fun.hpp> #include <set> #include <memory> #include <functional> #include <iostream> int main() { boost::ptr_set<int> s; s.insert(new int{2}); s.insert(new int{1}); std::cout << *s.begin() << '\n'; std::set<std::unique_ptr<int>, boost::indirect_fun<std::less<int>>> v; v.insert(std::unique_ptr<int>(new int{2})); v.insert(std::unique_ptr<int>(new int{1})); std::cout << **v.begin() << '\n'; }
示例 1 說明了使用專用容器的另一個原因。該示例將 int 類型的動態分配變量存儲在 boost::ptr_set 和 std::set 中。 std::set 與 std::unique_ptr 一起使用。
使用 boost::ptr_set,元素的順序取決于 int 值。 std::set 比較 std::unique_ptr 類型的指針,而不是指針引用的變量。要使 std::set 根據 int 值對元素進行排序,必須告知容器如何比較元素。在示例 1 中,使用了 boost::indirect_fun(由 Boost.PointerContainer 提供)。使用 boost::indirect_fun,std::set 被告知不應該根據 std::unique_ptr 類型的指針對元素進行排序,而是根據指針所指的 int 值。這就是示例顯示 1 兩次的原因。
除了 boost::ptr_vector 和 boost::ptr_set 之外,還有其他容器可用于管理動態分配的對象。這些附加容器的示例包括 boost::ptr_deque、boost::ptr_list、boost::ptr_map、boost::ptr_unordered_set 和 boost::ptr_unordered_map。這些容器對應于標準庫中眾所周知的容器。
例子2 .來自 Boost.PointerContainer 的容器插入器
#include <boost/ptr_container/ptr_vector.hpp> #include <boost/ptr_container/ptr_inserter.hpp> #include <array> #include <algorithm> #include <iostream> int main() { boost::ptr_vector<int> v; std::array<int, 3> a{{0, 1, 2}}; std::copy(a.begin(), a.end(), boost::ptr_container::ptr_back_inserter(v)); std::cout << v.size() << '\n'; }
Boost.PointerContainer 為其容器提供插入器。它們在命名空間 boost::ptr_container 中定義。要訪問插入器,您必須包含頭文件 boost/ptr_container/ptr_inserter.hpp。
示例 2 使用函數 boost::ptr_container::ptr_back_inserter(),它創建了一個 boost::ptr_container::ptr_back_insert_iterator 類型的插入器。此插入器被傳遞給 std::copy() 以將數組 a 中的所有數字復制到向量 v。因為 v 是 boost::ptr_vector 類型的容器,它需要動態分配的 int 對象的地址,所以插入器使用堆上的新地址并將地址添加到容器中。
除了 boost::ptr_container::ptr_back_inserter() 之外,Boost.PointerContainer 還提供了 boost::ptr_container::ptr_front_inserter() 和 boost::ptr_container::ptr_inserter() 函數來創建相應的插入器。
三、練習
使用成員變量 name、legs 和 has_tail 創建一個包含多個動物類型對象的程序。將對象存儲在 Boost.PointerContainer 的容器中。根據腿按升序對容器進行排序,并將所有元素寫入標準輸出。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127045979
相關推薦
- 2023-08-12 JQ 實現復制到剪切板
- 2023-07-08 el-dialog遮罩層遮擋問題
- 2022-04-22 小程序和網站中無限滾動的實現
- 2022-04-27 解決linux下redis數據庫overcommit_memory問題_Redis
- 2022-10-10 Python3?re.search()方法的具體使用_python
- 2022-05-05 Python學習之流程控制與條件判斷總結_python
- 2022-09-27 Android開發EditText實現密碼顯示隱藏_Android
- 2022-09-29 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同步修改后的遠程分支