C++ Boost Tokenizer使用詳細(xì)講解
介紹
庫(kù) Boost.Tokenizer 允許您通過將某些字符解釋為分隔符來迭代字符串中的部分表達(dá)式。使用 boost::tokenizer 迭代字符串中的部分表達(dá)式
示例一
使用 boost::tokenizer 迭代字符串中的部分表達(dá)式
#include <boost/tokenizer.hpp> #include <string> #include <iostream> int main() { typedef boost::tokenizer<boost::char_separator<char>> tokenizer; std::string s = "Boost C++ Libraries"; tokenizer tok{s}; for (tokenizer::iterator it = tok.begin(); it != tok.end(); ++it) std::cout << *it << '\n'; }
Boost.Tokenizer 在 boost/tokenizer.hpp 中定義了一個(gè)名為 boost::tokenizer 的類模板。它期望一個(gè)標(biāo)識(shí)連貫表達(dá)式的類作為模板參數(shù)。示例 10.1 使用了 boost::char_separator 類,它將空格和標(biāo)點(diǎn)符號(hào)解釋為分隔符。
必須使用 std::string 類型的字符串初始化標(biāo)記器。使用成員函數(shù) begin() 和 end(),可以像容器一樣訪問標(biāo)記器。用于初始化標(biāo)記器的字符串的部分表達(dá)式可通過迭代器獲得。部分表達(dá)式的計(jì)算方式取決于作為模板參數(shù)傳遞的類的類型。
因?yàn)?boost::char_separator 默認(rèn)將空格和標(biāo)點(diǎn)符號(hào)解釋為分隔符,所以示例 10.1 會(huì)顯示 Boost、C、+、+ 和庫(kù)。 boost::char_separator 使用 std::isspace() 和 std::ispunct() 來識(shí)別分隔符。 Boost.Tokenizer 區(qū)分應(yīng)該顯示的分隔符和應(yīng)該抑制的分隔符。默認(rèn)情況下,空格被抑制并顯示標(biāo)點(diǎn)符號(hào)。
示例二
初始化 boost::char_separator 以適應(yīng)迭代
#include <boost/tokenizer.hpp> #include <string> #include <iostream> int main() { typedef boost::tokenizer<boost::char_separator<char>> tokenizer; std::string s = "Boost C++ Libraries"; boost::char_separator<char> sep{" "}; tokenizer tok{s, sep}; for (const auto &t : tok) std::cout << t << '\n'; }
為了防止標(biāo)點(diǎn)符號(hào)被解釋為分隔符,請(qǐng)?jiān)趯?boost::char_separator 對(duì)象傳遞給分詞器之前對(duì)其進(jìn)行初始化。
boost::char_separator 的構(gòu)造函數(shù)一共接受三個(gè)參數(shù),但只需要第一個(gè)。第一個(gè)參數(shù)描述被抑制的各個(gè)分隔符。示例 10.2 與示例 10.1 一樣,將空格視為分隔符。
第二個(gè)參數(shù)指定應(yīng)顯示的分隔符。如果省略此參數(shù),則不顯示分隔符,程序現(xiàn)在將顯示 Boost、C++ 和庫(kù)。
示例三
使用 boost::char_separator 模擬默認(rèn)行為
#include <boost/tokenizer.hpp> #include <string> #include <iostream> int main() { typedef boost::tokenizer<boost::char_separator<char>> tokenizer; std::string s = "Boost C++ Libraries"; boost::char_separator<char> sep{" ", "+"}; tokenizer tok{s, sep}; for (const auto &t : tok) std::cout << t << '\n'; }
如果將加號(hào)作為第二個(gè)參數(shù)傳遞,則示例 10.3 的行為類似于示例 10.1。
第三個(gè)參數(shù)決定是否顯示空的部分表達(dá)式。如果連續(xù)找到兩個(gè)分隔符,則對(duì)應(yīng)的部分表達(dá)式為空。默認(rèn)情況下,不顯示這些空表達(dá)式。使用第三個(gè)參數(shù),可以更改默認(rèn)行為。
示例四
初始化 boost::char_separator 以顯示空的部分表達(dá)式
#include <boost/tokenizer.hpp> #include <string> #include <iostream> int main() { typedef boost::tokenizer<boost::char_separator<char>> tokenizer; std::string s = "Boost C++ Libraries"; boost::char_separator<char> sep{" ", "+", boost::keep_empty_tokens}; tokenizer tok{s, sep}; for (const auto &t : tok) std::cout << t << '\n'; }
示例 10.4 顯示了兩個(gè)額外的空部分表達(dá)式。第一個(gè)位于兩個(gè)加號(hào)之間,而第二個(gè)位于第二個(gè)加號(hào)和后面的空格之間。
示例五
具有寬字符串的 Boost.Tokenizer
#include <boost/tokenizer.hpp> #include <string> #include <iostream> int main() { typedef boost::tokenizer<boost::char_separator<wchar_t>, std::wstring::const_iterator, std::wstring> tokenizer; std::wstring s = L"Boost C++ Libraries"; boost::char_separator<wchar_t> sep{L" "}; tokenizer tok{s, sep}; for (const auto &t : tok) std::wcout << t << '\n'; }
示例 10.5 迭代一個(gè) std::wstring 類型的字符串。為了支持此字符串類型,必須使用附加模板參數(shù)初始化標(biāo)記器。類 boost::char_separator 也必須用 wchar_t 初始化。
除了 boost::char_separator 之外,Boost.Tokenizer 還提供了兩個(gè)額外的類來識(shí)別部分表達(dá)式。
示例六
使用 boost::escaped_list_separator 解析 CSV 文件
#include <boost/tokenizer.hpp> #include <string> #include <iostream> int main() { typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer; std::string s = "Boost,\"C++ Libraries\""; tokenizer tok{s}; for (const auto &t : tok) std::cout << t << '\n'; }
boost::escaped_list_separator 用于讀取以逗號(hào)分隔的多個(gè)值。這種格式通常稱為 CSV(逗號(hào)分隔值)。 boost::escaped_list_separator 還處理雙引號(hào)和轉(zhuǎn)義序列。因此,示例 10.6 的輸出是 Boost 和 C++ 庫(kù)。
提供的第二個(gè)類是 boost::offset_separator,它必須被實(shí)例化。相應(yīng)的對(duì)象必須作為第二個(gè)參數(shù)傳遞給 boost::tokenizer 的構(gòu)造函數(shù)。
示例七
使用 boost::offset_separator 迭代部分表達(dá)式
#include <boost/tokenizer.hpp> #include <string> #include <iostream> int main() { typedef boost::tokenizer<boost::offset_separator> tokenizer; std::string s = "Boost_C++_Libraries"; int offsets[] = {5, 5, 9}; boost::offset_separator sep{offsets, offsets + 3}; tokenizer tok{s, sep}; for (const auto &t : tok) std::cout << t << '\n'; }
boost::offset_separator 指定字符串中各個(gè)部分表達(dá)式結(jié)束的位置。示例 10.7 指定第一個(gè)部分表達(dá)式在 5 個(gè)字符后結(jié)束,第二個(gè)在另外 5 個(gè)字符后結(jié)束,第三個(gè)在以下 9 個(gè)字符后結(jié)束。輸出將是 Boost、_C++_ 和庫(kù)。
到此這篇關(guān)于C++ Boost Tokenizer使用詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost Tokenizer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++函數(shù)指針和回調(diào)函數(shù)示例
這篇文章主要介紹了c++函數(shù)指針和回調(diào)函數(shù)示例,需要的朋友可以參考下2014-05-05Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問題詳解
遺傳算法起源于對(duì)生物系統(tǒng)所進(jìn)行的計(jì)算機(jī)模擬研究。其本質(zhì)是一種高效、并行、全局搜索的方法,能在搜索過程中自動(dòng)獲取和積累有關(guān)搜索空間的知識(shí),并自適應(yīng)地控制搜索過程以求得最佳解。本文將利用其求解非連續(xù)函數(shù)問題,需要的可以參考一下2022-09-09VC++實(shí)現(xiàn)選擇排序算法簡(jiǎn)單示例
這篇文章主要介紹了VC++實(shí)現(xiàn)選擇排序算法簡(jiǎn)單示例,代碼簡(jiǎn)潔易懂,有助于讀者對(duì)數(shù)據(jù)結(jié)構(gòu)與算法的學(xué)習(xí),需要的朋友可以參考下2014-08-08