Learning boost 3 -- string algorithm 1

Learning boost 3

string algorithm 1

简介

string algorithmboost中提供字符串算法的类库。在这里,字符串不一定是std::basic_string,也可以是其它的stl容器或是c++中的零结尾字符串char*

例:

std::string str("Hello");

std::vector<char> vstr(str.begin(), str.end());

char *cstr=new char(str.size());

std::copy(str.begin(), str.end(), cstr);

    

boost::to_upper(str);       //string

boost::to_upper(vstr);  //vector<char>

boost::to_upper(cstr);  //char*

 

另外,在string algorithm中的很多算法都分为mutable copymutable算法直接修改输入的字符串,而copy算法返回一个新的字符串或通过一个迭代器输出。

string algorithm中碰到一个IteratorRange的概念,这是boost::range中的一个类,我也不会使用,不过可以使用make_iterator_range(iterator, iterator)来构造。iterator_range通过两个开始和结束迭代器表示一段范围,一般通过查找算法的返回来得到。

例:

std::string str1("Hello");

std::string str2("Hello");

 

boost::to_upper(str1);//mutable algorithm,现在str1==”HELLO”

 

std::string str3=boost::to_upper_copy(str2);//copy algorithm, str3==”HELLO”

/*

char * p =boost::to_upper_copy("Hello");

这是错的。因为to_upper_copy不会去申请一段内存保存"Hello"的拷贝。

char str[]={"Hello"};

to_upper(str);这样这就可以了。

*/

    

std::string str4;

    

 

boost::to_upper_copy(std::back_inserter(str4),

                    std::make_pair(str2.begin(), str2.end())

                    );//使用迭代器的copy algorithm, str4==”HELLO”

                      //这里注意,这里和stl不同的是输出迭代器在输入迭代器的前面

boost::to_upper_copy(std::back_inserter(str4), "Hello");str4==”HELLOHELLO”

//这也是可以的,前面说过了IteratorRange相当于一个容器,

//stl标准容器,std::basic_string char*都可以作为string_algorithm中的容器

Case Conversion Algorithm 大小写转换算法

void           to_lower(MutableCollection&, std::local&=std::local());

void           to_upper(MutableCollection&, std::local&=std::local());

 

Sequence       to_lower_copy(const Sequence&, std::local&=std::local());

Sequence       to_upper_copy(const Sequence&, std::local&=std::local());

 

OutputIterator to_lower_copy(OutputIterator, const Collection&, std::local&=std::local());

OutputIterator to_lower_copy(OutputIterator, const Collection&, std::local&=std::local());

 

string algorithm中,Collection指:

l         stl标准类型

l         内建数组(如:int[])

l         零结尾字符串(char*wchar *)

l         pair<iterator, iterator>

MutableCollection当然是指非const collection

Sequence好像只能是标准容器。

 

Trim Algorithm Trim算法

void trim       (Sequence&, std::local&=std::local());

void trim_left  (Sequence&, std::local&=std::local());

void trim_right (Sequence&, std::local&=std::local());

 

Sequence trim_copy        (const Sequence&, std::local&=std::local());

Sequence trim_left_copy  (const Sequence&, std::local&=std::local());

Sequence trim_right_copy (const Sequence&, std::local&=std::local());

上述算法删除字符串中左右(或是其中之一)的空格。

 

void trim_if      (Sequence&, Predicate);

void trim_left_if (Sequence&, Predicate);

void trim_right_if(Sequence&, Predicate);

 

Sequence trim_copy_if      (const Sequence&, Predicate);

Sequence trim_left_copy_if (const Sequence&, Predicate);

Sequence trim_right_copy_if(const Sequence&, Predicate);

 

OutputIterator trim_copy_if      (OutputIterator, const Collection&, Predicate);

OutputIterator trim_left_copy_if (OutputIterator, const Collection&, Predicate);

OutputIterator trim_right_copy_if(OutputIterator, const Collection&, Predicate);

上述算法删除字符串左右(或是其中之一)满足Predicate的字符。

Predicate是一个一元判断式。

例:

string str(“---Hello---”);

boost::trim_if(str, bind2nd(equal_to<char>(), ’-‘));//str==”Hello”

 

Predicate 判断式

string algorithm中提供了一些与字符串相关的判断式。

bool starts_with (Input, Test);

bool starts_with (Input, Test, Comp)

bool istarts_with(Input, Test, Local)

判断Input是否以Test开头。Comp是比较字符的二元判断式。Localstd::local

 

bool ends_with (Input, Test);

bool ends_with (Input, Test, Comp)

bool iends_with(Input, Test, Local)

判断Input是否以Test结尾。Comp是比较字符的二元判断式。Localstd::local

 

bool contains (Input, Test);

bool contains (Input, Test, Comp)

bool icontains(Input, Test, Local)

判断Input是否包含TestComp是比较字符的二元判断式。Localstd::local

 

bool equals (Input, Test);

bool equals (Input, Test, Comp)

bool iequals(Input, Test, Local)

判断Input是否和Test相同。Comp是比较字符的二元判断式。Localstd::local

 

bool all(Input, Pred);

判断Input的每一个字符是否满足Pred判断式。

 

Classfication 类别判断式

classfication也是判断式,它们是对std::isspace等函数的泛型化封装。

unspecified is_classified(std::ctype_base::mask, const std::locale & = std::locale());

unspecified is_space      (const std::locale & = std::locale());

unspecified is_alnum      (const std::locale & = std::locale());

unspecified is_alpha      (const std::locale & = std::locale());

unspecified is_cntrl      (const std::locale & = std::locale());

unspecified is_digit      (const std::locale & = std::locale());

unspecified is_graph      (const std::locale & = std::locale());

unspecified is_lower      (const std::locale & = std::locale());

unspecified is_print      (const std::locale & = std::locale());

unspecified is_punct      (const std::locale & = std::locale());

unspecified is_upper      (const std::locale & = std::locale());

unspecified is_xdigit     (const std::locale & = std::locale());

判断字符是否是某个类型,返回判断式。

例:

trim_copy_if(string(“123Hello 890” , is_digit()));//return “Hello”

 

unspecified is_any_of(Set);

判断字符是否是Set中的一个,返回判断式。

 

unspecified is_from_range(From, To);

判断字符是否是否处在FromTo之间(From<=Ch<=To)

 

unspecified operator&&(Pred1, Pred2);

unspecified operator||(Pred1, Pred2);

unspecified operator!(Pred);

classfication判断式的与或非运算。注意:只能对上述的classfication判断式使用。

例:

trim_copy_if(string(“123Hello 890” ), is_digit()||is_upper());//return “ello”

 

iterator_range Class 迭代器范围类

iterator_range是对一组迭代器的封装。一般用于find算法的返回值。

iterator_range有类似于stl容器的begin(), end(), empty(), size(), swap(), bool operator()成员函数。

一般使用make_iterator_range()来构造iterator_rangmake_iterator_range使用两个迭代器或者是pair<iterator, iterator>作为参数。

还可以使用流来输出iterator_range

例:

string str(“Hello”);

cout<<make_iterator_range(str.begin()+1, str.end()-1);//output “ell”

对于iterator_rangeostream输出类似于 copy(it.begin(),it.end(),ostream_iterator<char>(“”));

无空格的连续输出。

Erase Algorithm 删除算法

OutputIterator erase_range_copy (OutputIterator, Input, SearchRange);

Sequence       erase_range_copy (Input, SearchRange);

 

void           erase_range       (Input, SearchRange);

删除输入字符串中SearchRange那部分。SearchRange是一个iterator_range对象。

例:

std::string str1("Hello");

std::string str2;

    

boost::erase_range(str1, boost::make_iterator_range(str1.begin()+1, str1.end()-1));

cout<<str1<<endl;//输出”Ho”

 

erase_range_copy(back_inserter(str2),

                    str1,

                    boost::make_iterator_range(str1.begin()+1, str1.end()-1));

cout<<str2<<endl;//输出”Ho”

 

OutputIterator erase_first_copy(OutputIterator, Input, Search);

Sequence       erase_first_copy(Input, Search);

void           erase_first     (Input, Search);

 

OutputIterator ierase_first_copy(OutputIterator, Input, Search, Local);

Sequence       ierase_first_copy(Input, Search, Local);

void           ierase_first     (Input, Search, Local);

删除从Input中查找到的第一个Search

例:

std::string str1("Hello");

std::string str2;

 

boost::erase_first(str1, "ll");

str2=boost::erase_first_copy(string("Hello"), "l");

cout<<str1<<endl;//输出”Heo”

cout<<str2<<endl;//输出”Helo”

 

OutputIterator erase_last_copy(OutputIterator, Input, Search);

Sequence       erase_last_copy(Input, Search);

void           erase_last     (Input, Search);

 

OutputIterator ierase_last_copy(OutputIterator, Input, Search, Local);

Sequence       ierase_last_copy(Input, Search, Local);

void           ierase_last     (Input, Search, Local);

删除从Input中查找到的最后一个Search

 

OutputIterator erase_nth_copy(OutputIterator, Input, Search, n);

Sequence       erase_nth_copy(Input, Search, n);

void           erase_nth      (Input, Search, n);

 

OutputIterator ierase_nth_copy(OutputIterator, Input, Search, n, Local);

Sequence       ierase_nth_copy(Input, Search, n, Local);

void           ierase_nth     (Input, Search, n, Local);

删除从Input中查找到的第nSearch。(n是基于0的)

 

OutputIterator erase_all_copy(OutputIterator, Input, Search);

Sequence       erase_all_copy(Input, Search);

void           erase_all     (Input, Search);

 

OutputIterator ierase_all_copy(OutputIterator, Input, Search, Local);

Sequence       ierase_all_copy(Input, Search, Local);

void           ierase_all     (Input, Search, Local);

删除从Input中查找到的所有Search

 

OutputIterator erase_head_copy (OutputIterator, Input, n);

Sequence       erase_head_copy (Input, n);

void           erase_head     (Input, n)

删除Input的前n个字符。如果n大于输入字符串长度,那么整个字符串会被删除。

 

OutputIterator erase_tail_copy (OutputIterator, Input, n);

Sequence       erase_tail_copy (Input, n);

void           erase_tail      (Input, n);

删除Input的最后n个字符。如果n大于输入字符串长度,那么整个字符串会被删除。

 

Replace Algorithm 替换算法

OutputIterator replace_range_copy (OutputIterator, Input, SearchRange, Format);

Sequence       replace_range_copy (Input, SearchRange, Format);

void           replace_range      (Input, SearchRange, Format);

Input中的SearchRange部分替换成Format

 

OutputIterator replace_first_copy (OutputIterator, Input, Search, Format);

Sequence       replace_first_copy (Input, Search, Format);

void           replace_first      (Input, Search, Format);

 

OutputIterator ireplace_first_copy (OutputIterator, Input, Search, Format, Local);

Sequence       ireplace_first_copy (Input, Search, Format, Local);

void           ireplace_first      (Input, Search, Format, Local);

Input中搜索到的第一个Search替换成Format

 

OutputIterator replace_last_copy (OutputIterator, Input, Search, Format);

Sequence       replace_last_copy (Input, Search, Format);

void           replace_last      (Input, Search, Format);

 

OutputIterator ireplace_last_copy (OutputIterator, Input, Search, Format, Local);

Sequence       ireplace_last_copy (Input, Search, Format, Local);

void           ireplace_last      (Input, Search, Format, Local);

Input中搜索到的最后一个Search替换成Format

 

OutputIterator replace_nth_copy (OutputIterator, Input, Search, Format, n);

Sequence       replace_nth_copy (Input, Search, Format, n);

void           replace_nth      (Input, Search, Format, n);

 

OutputIterator ireplace_nth_copy (OutputIterator, Input, Search, Format, n, Local);

Sequence       ireplace_nth_copy (Input, Search, Format, n, Local);

void           ireplace_nth      (Input, Search, Format, n, Local);

Input中搜索到的第nSearch替换成Format

 

OutputIterator replace_all_copy (OutputIterator, Input, Search, Format);

Sequence       replace_all_copy (Input, Search, Format);

void           replace_all      (Input, Search, Format);

 

OutputIterator ireplace_all_copy (OutputIterator, Input, Search, Format, Local);

Sequence       ireplace_all_copy (Input, Search, Format, Local);

void           ireplace_all      (Input, Search, Format, Local);

Input中所有的Search替换成Format

 

OutputIterator replace_head_copy(OutputIterator, Input, n, Format);

Sequence       replace_head_copy(Input, n, Format);

void           replace_head     (Input, n, Format);

Input中前n个字符替换成Format

 

OutputIterator replace_tail_copy(OutputIterator, Input, n, Format);

Sequence        replace_tail_copy(Input, n, Format);

void             replace_tail      (Input, n, Format);

Input中最后n个字符替换成Format

 

Finder Object Finder仿函数

Finder Object是一个仿函数,它用来决定在find算法中的匹配策略。可以在find_iterator中使用。

Finder first_finder(Search);

Finder first_finder(Search, Comp);

返回在输入中查找第一个SearchFinder对象。

 

Finder last_finder(Search);

Finder last_finder(Search, Comp);

返回在输入中查找最后一个SearchFinder对象。

 

Finder nth_finder(Search, n);

Finder nth_finder(Search, n, Comp);

返回在输入中查找第一个SearchFinder对象。

 

Finder head_finder(n);

Finder tail_finder(n);

返回在输入中查找最前(后)n个字符的Finder对象。(n是基于0的)

 

Finder token_finder(Pred, Compress= token_compress_off);

返回满足Pred判断式的字符的查找的Finder对象。

Pred 是类似于bool pred(char c);这样的函数或仿函数。

Compress可以取值为:

token_compress_on :将相邻的满足Pred的字符合并作为查找结果。

token_compress_off:不合并相邻的字符。

例如:对于bind2nd(equal_to<char>,’c’)这样的判断式,用token_finder查找”aabbcc”,对于token_compress_on结果是”cc”,对于token_compress_off是分别查找到两个”c”

 

Finder range_finder(beg, end);

Finder range_finder(iterator_range);

返回查找特定范围的Finder对象。

Find算法

Find算法是在字符串中查找子串的算法,算法返回iterator_range类型。

iterator_range find(Input, Finder);

iterator_range find_first(Input, Search);

iterator_range ifind_first(Input, Search,Local=std::local());

iterator_range find_last(Input, Search);

iterator_range ifind_last(Input, Search, Local=std::local());

iterator_range find_nth(Input, Search, n);

iterator_range ifind_nth(Input, Search, n, Local=std::local());

iterator_range find_head(Input, n);

iterator_range find_tail(Input, n);

iterator_range find_token(Input, Pred, Compress= token_compress_off);

上述的算法都很简单,我就不多说了。

我来分析一下find_firstfind_first的源代码是这样的:

template<typename Collection1T, typename Collection2T>

        inline iterator_range<

            BOOST_STRING_TYPENAME result_iterator_of<Collection1T>::type>

        find_first(

            Collection1T& Input,

            const Collection2T& Search)

        {

            return first_finder(Search)(

                begin(Input),end(Input));

        }

result_iterator_of<Collection1T>::typeCollection1T::iterator

begin(Input)Input.begin()

end(Input)Input.end()

first_finder(Search)返回一个first_finder对象,然后调用这个Finder.operator()(beg,end),并且以iterator_range作为查找结果返回。其实对于每一个Finder都重载了operator()函数,使用这个函数就可以对字符串直接查找。

 

Find Iterator 查找迭代器

find算法只能查找到一个结果,而通过find_iterator可以查找所有的结果。

template<typename Iterator> class find_iterator;

find_iterator make_find_iterator(Input, Finder);

find_iterator的成员函数:

  find_iterator()默认构造函数

  find_iterator(beg, end, Finder)begend之间查找

  find_iterator(Input, Finder)查找Input

 

  bool eof()是否查找结束

例:

std::string str1("ten 10 nine 9 and eight 8");

 

boost::find_iterator<string::iterator> it;

for (it = make_find_iterator(str1,

                                  token_finder(boost::is_digit(),

                                                 boost::token_compress_on)//查找连续数字的token_finder

                                 )

         ;!it.eof();++it)//注意是it.eof()it->意味着(*it). *it是一个iterator_range对象

        cout<<*it<<endl;//*it返回查找结果:一个iterator_range对象,而一个iterator_range是可以直接输出的。

//输出:

//10

//9

//8

 

在使用find_iterator的过程中,不能修改字符串的长度,例如:erase_range(str1,*it)如果是replace就可以。

另外,find_iteratorForward迭代器,不能--it

 

template<typename Iterator> class split_iterator;

find_iterator make_split_iterator(Input, Finder);

split_iterator使用查找到的字串来分隔字符串,例如对于上述例子,用split替换find,结果是:

ten

 nine

 and eight

 

splite_iterator的其它用法和find_iterator一样。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值