喜歡這篇文章嗎?喜歡的話去看博主的置頂博客,即可依據分類找到此文章的原版得到更好的體驗,
圖片及代碼顯示的問題,筆者深感抱歉,想要更好的體驗去原博文即可。
title: Boost學習筆記5 - Boost::StringAlgorithms
mathjax: true
date: 2020-03-17 19:56:26
categories: [c++筆記,Boost學習筆記]
tags: [c++筆記,Boost學習筆記]
keywords: [c++筆記,Boost學習筆記]
StringAlgorithms
我終於找到一個暫時沒有被編入C++17的庫了,聽說在C++20中他也沒進,哈哈哈。
大小寫轉化
首先上來的肯定就是大小寫轉化啦,使用函數to_upper_copy(string)就可以了。
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = "abcdefgABCDEFG";
std::cout << boost::algorithm::to_upper_copy(s) << std::endl;
std::cout << boost::algorithm::to_lower_copy(s) << std::endl;
}
刪除子串
erase_all_copy就是說先copy一份,然後再將子串全部刪除,如果不帶copy就是說直接操作穿進去的母串。下面的代碼都可以去掉_copy,erase_first指的是刪除第一次出現的,last指的是刪除最後一次出現的,nth指的是刪除第n次出現的,n從0開始,erase_head值的是刪除前n個字符,erase_tail指的是刪除後n個字符。
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = "000111000111ababab000111000111";
std::cout << s << std::endl;
// boost::algorithm::erase_all(s,"ab");
std::cout << boost::algorithm::erase_all_copy(s, "ab") << std::endl;
std::cout << boost::algorithm::erase_first_copy(s, "111") << std::endl;
std::cout << boost::algorithm::erase_last_copy(s, "111") << std::endl;
std::cout << boost::algorithm::erase_nth_copy(s, "111",0) << std::endl;
std::cout << boost::algorithm::erase_nth_copy(s, "111",100) << std::endl;
std::cout << boost::algorithm::erase_head_copy(s, 4) << std::endl;
std::cout << boost::algorithm::erase_tail_copy(s, 4) << std::endl;
}
查找子串
find一類的函數,同上,他將返回一個iterator_range的迭代器。這個迭代器可以操作子串。注意子串和母串共享空間。
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = "000111000111ababab000111000111";
std::cout << s << std::endl;
auto x = boost::algorithm::find_first(s,"000");
x[0] = '2';
std::cout << s << std::endl;
//std::cout << boost::algorithm::find_last(s, "111") << std::endl;
}
又是一套代碼下來了
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = "000111000111ababab000111000111";
std::cout << s << std::endl;
auto x = boost::algorithm::find_first(s,"000");
x = boost::algorithm::find_last(s,"1");
x = boost::algorithm::find_nth(s,"1",3);
x = boost::algorithm::find_tail(s,3);
x = boost::algorithm::find_head(s,3);
std::cout << s << std::endl;
//std::cout << boost::algorithm::find_last(s, "111") << std::endl;
}
替換子串
replace又是一套如下
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = "000111000111ababab000111000111";
std::cout << s << std::endl;
// boost::algorithm::replace_all(s,"ab");
std::cout << boost::algorithm::replace_all_copy(s, "ab","all") << std::endl;
std::cout << boost::algorithm::replace_first_copy(s, "111","first") << std::endl;
std::cout << boost::algorithm::replace_last_copy(s, "111","last") << std::endl;
std::cout << boost::algorithm::replace_nth_copy(s, "111", 0,"nth") << std::endl;
std::cout << boost::algorithm::replace_nth_copy(s, "111", 100,"nth") << std::endl;
std::cout << boost::algorithm::replace_head_copy(s, 2,"Head") << std::endl;
std::cout << boost::algorithm::replace_tail_copy(s, 2,"Tail") << std::endl;
}
修剪字符串
trim_left_copy 指的是從左邊開始修建,刪掉空字符等,trim_right_copy是從右邊開始修建,trim_copy是兩邊一起修剪。
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = "\t ab d d d d d \t";
std::cout << "|" << s << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_left_copy(s) << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_right_copy(s) << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_copy(s) << "|" << std::endl;
}
這個代碼輸出了
| ab d d d d d |
|ab d d d d d |
| ab d d d d d|
|ab d d d d d|
我們還可以通過指定謂詞來修剪使用trim_left_copy_if
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = " 01 0 1 000ab d d d d d 11111111";
std::cout << "|" << s << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_left_copy_if(s,boost::algorithm::is_any_of(" 01")) << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_right_copy_if(s,boost::algorithm::is_any_of(" 01")) << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_copy_if(s,boost::algorithm::is_any_of(" 01")) << "|" << std::endl;
}
更多的謂詞,我們還有is_lower、is_upper、is_space等謂詞。
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = " 01 0 1 000ab d d d d d 11111111";
std::cout << "|" << s << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_copy_if(s,boost::algorithm::is_space()) << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_copy_if(s,boost::algorithm::is_digit()) << "|" << std::endl<<std::endl;
s = "aaaBBBaBBaaa";
std::cout << "|" << s << "|" << std::endl;
std::cout << "|" << boost::algorithm::trim_copy_if(s,boost::algorithm::is_lower()) << "|" << std::endl;
}
字符串比較
starts_with(s,t)判斷s是否以t開頭,類似的有ends_with,contains,lexicographical_compare分別表示s是否以t結尾,s是否包含t,s與t的字典序比較。
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::cout << boost::algorithm::starts_with("abcde", "abc") << std::endl;
std::cout << boost::algorithm::ends_with("abcde", "cde") << std::endl;
std::cout << boost::algorithm::contains("abcde", "cde") << std::endl;
std::cout << boost::algorithm::lexicographical_compare("abcde", "cde") << std::endl;
std::cout << boost::algorithm::lexicographical_compare("abcde", "abcde") << std::endl;
std::cout << boost::algorithm::lexicographical_compare("cde", "abcde") << std::endl;
}
字符串分割
這個就簡單多了,直接split+謂詞函數就行了
#include <boost/algorithm/string.hpp>
#include <iostream>
int main() {
std::string s = "abc abc abc * abc ( abc )";
std::vector<std::string> v;
boost::algorithm::split(v, s, boost::algorithm::is_any_of(" *()"));
for (auto x : v) std::cout << x << ".";
std::cout << std::endl;
}
輸出
abc.abc.abc...abc...abc...
我們注意看有些函數前面有個i,比如ierase_all, 這個說的是忽略大小寫。