字符串算法(string_algorithm) (3)

示例代码如下:

// 替换和删除 string str_2 = "Samus beat the monster.\n"; // replace cout << replace_first_copy(str_2, "Samus", "samus"); replace_last(str_2, "beat", "kill"); cout << str_2; replace_tail(str_2, 9, "ridley.\n"); cout << str_2; // delete cout << ierase_all_copy(str_2, "samus "); cout << replace_nth_copy(str_2, "l", 1, "L"); cout << erase_tail_copy(str_2, 8);

运行结果:

samus beat the monster. Samus kill the monster. Samus kill the ridley. kill the ridley. Samus kilL the ridley. Samus kill the 分割

string_algo提供了两个字符串分割算法:find_all(虽然它的名称含有find,但因为其功能而被归类为分割算法)和split,可以使用某种策略把字符串分割成若干部分,并将分割后的字符串拷贝存入指定的容器。

分割算法对容器类型的要求是必须能够持有查找到结果的拷贝或引用,因此容器的元素类型必须是string或iterator_range<string::iterator>,容器则可以是vector、list、deque等标准容器。

find_all算法类似于普通的查找算法,它搜索所有匹配的字符串,将其加入容器,有一个忽略大小写的前缀i版本。

split算法使用判断式Pred来确定分割的依据,如果字符ch满足判断式Pred(Pred(ch)==true),那么它就是一个分割符,将字符串从这里分割。

还有第三个参数eCompress可以取值为token_compress_on或token_compress_off,如果值为前者,那么当两个分隔符连续出现时,它们将被视为一个分隔符,如果值为后者则两个连续的分隔符标记了一个空字符串。参数eCompress的默认取值为token_compress_off。

string str = "Samus, Link.Zelda::Mario-Luigi+zelda"; deque<string> d; // 大小写无关查找 ifind_all(d, str, "zELDA"); assert(d.size() == 2); for(auto x: d) { cout << "[" << x << "]"; } cout << endl; // 存储range对象 list<iterator_range<string::iterator>> l; split(l, str, is_any_of(",.:-+")); // 使用标点分割 for(auto x: l) { cout << "[" << x << "]"; } cout << endl; l.clear(); split(l, str, is_any_of(",.:-+"), token_compress_on); for(auto x: l) { cout << "[" << x << "]"; } cout << endl;

程序运行结果如下:

[Zelda][zelda] [Samus][ Link][Zelda][][Mario][Luigi][zelda] [Samus][ Link][Zelda][Mario][Luigi][zelda] 合并

合并算法join是分割算法的逆运算,它把存储在容器中的字符串连接成一个新的字符串,并且可以指定连接的分隔符。

join还有一个后缀_if的版本,它接收一个判断式,只有满足判断式的字符串才能合并。

vector<string> v = list_of("Samus")("Link")("Zelda")("Mario"); cout << join(v, "+") << endl; cout << join_if( v, "**", [](string_ref s) { return contains(s, "a"); } ) << endl;

程序首先使用assign库向vector添加了4个字符串,然后用+合并它们。随后的join_if算法使用lambda表达式定义了一个简单的谓词,它包装了算法contains,判断字符串是否包含字符a。
程序运行结果如下:

Samus+Link+Zelda+Mario Samus**Zelda**Mario string_ref 功能

一种轻量级的string,持有string类型的引用

头文件 #include <boost/utility/string_ref.hpp> using namespace boost; 类摘要 template<typename charT,typename traits> class basic_string_ref { public: //和std::string有着几乎一样的接口 private: const charT* ptr_; //字符串指针 std::size_t len_; //字符串长度 };

不拷贝字符串,所以不分配内存,使用两个成员变量表示字符串

用法

【注意事项】只能像std::string&一样去获取其内容,但不能修改其本身

1、构造

//通过标准字符数组构造普通string,有拷贝成本 const char* ch = "hello"; string str(ch); //字符数组构造,无成本 string_ref s1(ch); //标准字符串构造,无成本 string_ref s2(str);

可以像使用普通string一样使用string_ref(除了修改)

2、用在哪

用于代替string&作为函数参数和返回值,可以完全避免字符串拷贝代价

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygxpy.html