網站首頁 編程語言 正文
一、說明
本節敘述關于Boost.Range和Adeptor兩個內容。
Boost.Range 是一個庫,乍一看,它提供的算法類似于標準庫提供的算法。例如,您會發現函數 boost::copy(),它的作用與 std::copy() 相同。但是, std::copy() 需要兩個參數,而 boost::copy() 需要一個范圍。
二、適配器
標準庫提供了幾種可以傳遞謂詞的算法。例如,傳遞給 std::count_if() 的謂詞確定計算哪些元素。 Boost.Range 提供了類似的函數 boost::count_if()。然而,這個算法只是為了完整性而提供的,因為 Boost.Range 提供了適配器,使得帶有謂詞的算法變得多余。
您可以將適配器視為過濾器。它們基于另一個范圍返回一個新范圍。數據不一定被復制。由于范圍只是一對迭代器,因此適配器返回一個新的對。該對仍可用于迭代原始范圍,但例如可以跳過某些元素。如果將 boost::count() 與此類適配器一起使用,則不再需要 boost::count_if()。不必多次定義算法,以便可以在有或沒有謂詞的情況下調用它們。
算法和適配器的區別在于算法迭代一個范圍并處理數據,而適配器返回一個新的范圍——新的迭代器——它決定了迭代返回的元素。但是,不執行迭代。必須首先調用算法。
示例 30.4。使用 boost::adaptors::filter() 過濾范圍
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <array>
#include <iterator>
#include <iostream>
int main()
{
std::array<int, 6> a{{0, 5, 2, 1, 3, 4}};
boost::copy(boost::adaptors::filter(a, [](int i){ return i > 2; }),
std::ostream_iterator<int>{std::cout, ","});
}
Example30.4
示例 30.4 使用了一個可以過濾范圍的適配器。如您所見,適配器只是一個函數。 boost::adaptors::filter() 的第一個參數是要過濾的范圍,第二個參數是謂詞。示例 30.4 中的謂詞刪除范圍內不大于 2 的所有數字。
boost::adaptors::filter() 不會更改范圍 a,它會返回一個新范圍。由于范圍與一對迭代器沒有太大區別,因此新范圍也指的是 a.但是,新范圍的迭代器會跳過所有小于或等于 2 的數字。
示例 30.4 將 5,3,4 寫入標準輸出。
示例 30.5。使用鍵()、值()和間接()
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <array>
#include <map>
#include <string>
#include <utility>
#include <iterator>
#include <iostream>
int main()
{
std::array<int, 3> a{{0, 1, 2}};
std::map<std::string, int*> m;
m.insert(std::make_pair("a", &a[0]));
m.insert(std::make_pair("b", &a[1]));
m.insert(std::make_pair("c", &a[2]));
boost::copy(boost::adaptors::keys(m),
std::ostream_iterator<std::string>{std::cout, ","});
boost::copy(boost::adaptors::indirect(boost::adaptors::values(m)),
std::ostream_iterator<int>{std::cout, ","});
}
Example30.5
示例 30.5 使用兩個適配器 boost::adaptors::keys() 和 boost::adaptors::values() 來訪問 std::map 類型容器中的鍵和值。它還顯示了如何嵌套適配器。因為 m 存儲指向要打印的值的指針,而不是值本身,所以 boost::adaptors::values() 返回的范圍將傳遞給 boost::adaptors::indirect()。當范圍由指針組成時,始終可以使用此適配器,但迭代應返回指針引用的值。這就是示例 30.5 將 a、b、c、0、1、2 寫入標準輸出的原因。
示例 30.6。 boost::adaptors::tokenize() - 字符串適配器
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/regex.hpp>
#include <string>
#include <iostream>
int main()
{
std::string s = "The Boost C++ Libraries";
boost::regex expr{"[\\w+]+"};
boost::copy(boost::adaptors::tokenize(s, expr, 0,
boost::regex_constants::match_default),
std::ostream_iterator<std::string>{std::cout, ","});
}
Example30.6
示例 30.6 引入了一個字符串適配器。您可以使用 boost::adaptors::tokenize() 在正則表達式的幫助下從字符串中獲取范圍。您將一個字符串和一個 boost::regex 類型的正則表達式傳遞給 boost::adaptors::tokenize()。此外,您需要傳遞一個引用正則表達式中的組的數字和一個標志。如果不使用組,則可以傳遞 0。標志 boost::regex_constants::match_default 選擇正則表達式的默認設置。您還可以傳遞其他標志。例如,如果您希望根據編程語言 Perl 的規則應用正則表達式,則可以使用 boost::regex_constants::match_perl。
練習
創建一個程序,將 0 到 100 之間的所有奇數按升序寫入標準輸出。僅使用來自 Boost.Range 的算法——沒有手動循環。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127497934
相關推薦
- 2022-10-25 Git中bundle命令的使用詳解_相關技巧
- 2022-10-20 flutter?material?widget組件之信息展示組件使用詳解_Android
- 2024-02-26 openJDK awt 字體支持
- 2022-10-27 Python中對字典的幾個處理方法分享_python
- 2022-11-17 React通過classnames庫添加類的方法_React
- 2022-11-15 python重用父類功能的兩種方式實例詳解_python
- 2022-04-18 Docker安裝Nacos服務的實現_docker
- 2022-06-09 Python中文分詞庫jieba(結巴分詞)詳細使用介紹_python
- 最近更新
-
- 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同步修改后的遠程分支