<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
請注意,其他 Boost 庫提供了許多演演算法。例如,您會在 Boost.StringAlgorithms 中找到處理字串的演演算法。 Boost.Algorithm 提供的演演算法不受特定類的約束,例如 std::string。與標準庫中的演演算法一樣,它們可以與任何容器一起使用。
範例 29.1。使用 boost::algorithm::one_of_equal() 測試一個值
#include <boost/algorithm/cxx11/one_of.hpp> #include <array> #include <iostream> using namespace boost::algorithm; int main() { std::array<int, 6> a{{0, 5, 2, 1, 4, 3}}; auto predicate = [](int i){ return i == 4; }; std::cout.setf(std::ios::boolalpha); std::cout << one_of(a.begin(), a.end(), predicate) << 'n'; std::cout << one_of_equal(a.begin(), a.end(), 4) << 'n'; }
boost::algorithm::one_of() 測試一個條件是否只滿足一次。要測試的條件作為謂詞傳遞。在範例 29.1 中,對 boost::algorithm::one_of() 的呼叫返回 true,因為數位 4 在 a 中僅儲存一次。
要測試容器中的元素是否相等,請呼叫 boost::algorithm::one_of_equal()。你沒有傳遞謂詞。相反,您傳遞一個值以與 boost::algorithm::one_of_equal() 進行比較。在範例 29.1 中,對 boost::algorithm::one_of_equal() 的呼叫也返回 true。
boost::algorithm::one_of() 是對 std::all_of()、std::any_of() 和 std::none_of() 演演算法的補充,這些演演算法是使用 C++11 新增到標準庫中的。但是,Boost.Algorithm 為開發環境不支援 C++ 的開發人員提供了函數 boost::algorithm::all_of()、boost::algorithm::any_of() 和 boost::algorithm::none_of() 11.您可以在標頭檔案 boost/algorithm/cxx11/all_of.hpp、boost/algorithm/cxx11/any_of.hpp 和 boost/algorithm/cxx11/none_of.hpp 中找到這些演演算法。
Boost.Algorithm 還定義了以下函數:boost::algorithm::all_of_equal()、boost::algorithm::any_of_equal() 和 boost::algorithm::none_of_equal()。
Boost.Algorithm 提供了更多來自 C++11 標準庫的演演算法。例如,您可以存取 boost::algorithm::is_partitioned()、boost::algorithm::is_permutation()、boost::algorithm::copy_n()、boost::algorithm::find_if_not() 和 boost::演演算法::iota()。這些函數的工作方式與 C++11 標準庫中的同名函數類似,並且是為不使用 C++11 的開發人員提供的。但是,Boost.Algorithm 提供了一些對 C++11 開發人員也很有用的函數變體。
範例 29.2。 C++11 演演算法的更多變體
#include <boost/algorithm/cxx11/iota.hpp> #include <boost/algorithm/cxx11/is_sorted.hpp> #include <boost/algorithm/cxx11/copy_if.hpp> #include <vector> #include <iterator> #include <iostream> using namespace boost::algorithm; int main() { std::vector<int> v; iota_n(std::back_inserter(v), 10, 5); std::cout.setf(std::ios::boolalpha); std::cout << is_increasing(v) << 'n'; std::ostream_iterator<int> out{std::cout, ","}; copy_until(v, out, [](int i){ return i > 12; }); }
Boost.Algorithm 在標頭檔案 boost/algorithm/cxx11/iota.hpp 中提供了 C++11 演演算法 boost::algorithm::iota()。此函數生成順序遞增的數位。它需要兩個迭代器用於容器的開頭和結尾。然後容器中的元素會被順序增加的數位覆蓋。
範例 29.2 使用 boost::algorithm::iota_n() 代替 boost::algorithm::iota()。此函數需要一個迭代器將數位寫入。要生成的數位數量作為第三個引數傳遞給 boost::algorithm::iota_n()。
boost::algorithm::is_increasing() 和 boost::algorithm::is_sorted() 在標頭檔案 boost/algorithm/cxx11/is_sorted.hpp 中定義。 boost::algorithm::is_increasing() 與 boost::algorithm::is_sorted() 具有相同的功能,但函數名稱更清楚地表示該函數檢查值是否按升序排列。標頭檔案還定義了相關的函數 boost::algorithm::is_decreasing()。
在範例 29.2 中,v 直接傳遞給 boost::algorithm::is_increasing()。 Boost.Algorithm 提供的所有函數都有一個基於範圍操作的變體。容器可以直接傳遞給這些函數。
boost::algorithm::copy_until() 在 boost/algorithm/cxx11/copy_if.hpp 中定義。這是 std::copy() 的另一個變體。 Boost.Algorithm 還提供了 boost::algorithm::copy_while()。
範例 29.2 作為 boost::algorithm::is_increasing() 的結果顯示為 true,並且 boost::algorithm::copy_until() 將數位 10、11 和 12 寫入標準輸出。
範例 29.3。來自 Boost.Algorithm 的 C++14 演演算法
#include <boost/algorithm/cxx14/equal.hpp> #include <boost/algorithm/cxx14/mismatch.hpp> #include <vector> #include <iostream> using namespace boost::algorithm; int main() { std::vector<int> v{1, 2}; std::vector<int> w{1, 2, 3}; std::cout.setf(std::ios::boolalpha); std::cout << equal(v.begin(), v.end(), w.begin(), w.end()) << 'n'; auto pair = mismatch(v.begin(), v.end(), w.begin(), w.end()); if (pair.first != v.end()) std::cout << *pair.first << 'n'; if (pair.second != w.end()) std::cout << *pair.second << 'n'; }
除了來自 C++11 標準庫的演演算法,Boost.Algorithm 還定義了很可能會新增到 C++14 標準庫中的演演算法。範例 29.3 使用了其中兩個函數的新變體,boost::algorithm::equal() 和 boost::algorithm::mismatch()。與自 C++98 以來已成為標準庫一部分的同名函數相比,將四個迭代器(而不是三個)傳遞給這些新函數。範例 29.3 中的演演算法不期望第二個序列包含與第一個序列一樣多的元素。
boost::algorithm::equal() 返回一個 bool,boost::algorithm::mismatch() 返回一個 std::pair 中的兩個迭代器。第一個和第二個是指第一個和第二個序列中第一個不匹配的元素。這些迭代器也可以參照序列的結尾。
範例 29.3 將 false 和 3 寫入標準輸出。 false 是 boost::algorithm::equal() 的返回值,3 w 中的第三個元素。因為 v 和 w 中的前兩個元素相等,所以 boost::algorithm::mismatch() 首先返回到 v 末尾的迭代器,然後返回到 w 的第三個元素的迭代器。因為 first 指的是 v 的結尾,所以迭代器沒有被取消參照,也沒有輸出。
範例 29.4。使用 boost::algorithm::hex() 和 boost::algorithm::unhex()
#include <boost/algorithm/hex.hpp> #include <vector> #include <string> #include <iterator> #include <iostream> using namespace boost::algorithm; int main() { std::vector<char> v{'C', '+', '+'}; hex(v, std::ostream_iterator<char>{std::cout, ""}); std::cout << 'n'; std::string s = "C++"; std::cout << hex(s) << 'n'; std::vector<char> w{'4', '3', '2', 'b', '2', 'b'}; unhex(w, std::ostream_iterator<char>{std::cout, ""}); std::cout << 'n'; std::string t = "432b2b"; std::cout << unhex(t) << 'n'; }
範例 29.4 使用了兩個函數 boost::algorithm::hex() 和 boost::algorithm::unhex()。這些函數是根據資料庫系統 MySQL 中的同名函數設計的。它們將字元轉換為十六進位制值或將十六進位制值轉換為字元。
範例 29.4 將帶有字元“C”、“+”和“+”的向量 v 傳遞給 boost::algorithm::hex()。此函數需要一個迭代器作為第二個引數來寫入十六進位制值。該範例將“C”的 43 和“+”的兩個範例的 2B(兩次)寫入標準輸出。對 boost::algorithm::hex() 的第二次呼叫執行相同的操作,只是“C++”作為字串傳遞,而“432B2B”作為字串返回。
boost::algorithm::unhex() 與 boost::algorithm::hex() 相反。如果範例 29.4 中的陣列 w 使用六個十六進位制值傳遞,則三對值中的每一對都被解釋為 ASCII 碼。當六個十六進位制值作為字串傳遞時,第二次呼叫 boost::algorithm::unhex() 也會發生同樣的情況。在這兩種情況下,C++ 都被寫入標準輸出。
Boost.Algorithm 提供了更多的演演算法。例如,有幾種字串匹配演演算法可以有效地搜尋文字。該檔案包含所有可用演演算法的概述。
使用 Boost.Algorithm 中的函數以升序將數位 51 到 56 分配給具有六個元素的陣列。將陣列中的數位解釋為十六進位制值,將它們轉換為字元並將結果寫入標準輸出。
到此這篇關於C++ Boost Algorithm演演算法超詳細精講的文章就介紹到這了,更多相關C++ Boost Algorithm內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45