实现std::string的ltrim、rtrim和trim方法

stl库的std::string类型没有提供常用的ltrim/rtrim/trim成员函数。下面的代码通过外部独立函数的形式实现了这些功能:

 1 namespace {
 2 bool isntspace(const char& ch) {
 3         return !isspace(ch);
 4 }
 5 } // end of namespace
 6 
 7 const string ltrim(const string& s) {
 8         string::const_iterator iter = find_if(s.begin(), s.end(), isntspace);
 9         return string(iter, s.end());
10 }
11 
12 const string rtrim(const string& s) {
13         string::const_iterator iter = find_if(s.rbegin(), s.rend(), isntspace).base();
14         return string(s.begin(), iter);
15 }
16 
17 const string trim(const string& s) {
18         string::const_iterator iter1 = find_if(s.begin(), s.end(), isntspace);
19         string::const_iterator iter2 = find_if(s.rbegin(), s.rend(), isntspace).base();
20 
21         return iter1 < iter2 ? string(iter1, iter2) : string("");
22 }

简单解释一下算法:

isntspace 是自定义的函数,位于匿名名字空间中,只能在本地编译单元中被引用。该函数调用标准库函数 isspace

find_if 该算法遍历指定的区域,返回第一个符合条件的迭代器,如果找不到就返回区域结束迭代器。

find_if(s.begin(), s.end(), isntspace);  该语句遍历 s.begin() 到 s.end()。通过函数 isntspace 检查每个遍历到的字符,如果发现该字符不是空格则返回该迭代器。

find_if(s.rbegin(), s.rend(), isntspace);  该语句遍历 s.rbegin() 到 s.rend(),这是反向遍历,也就是从字符串尾开始遍历。通过函数 isntspace 检查每个遍历到的字符,如果发现该字符不是空格则返回该迭代器。

base() 该函数返回反向迭代器对应的正向迭代器。

string::const_iterator 是随机迭代器,所以可以通过 < 运算符 来比较顺序。

另外一种网上较常见的写法是 用 std::not(ispace) 来代替 自定义函数 isntspace 。这种写法看上去是“更纯的stl”,但是我个人更喜欢使用自定义函数而不是复合使用模板。

原文地址:https://www.cnblogs.com/mopno1/p/4848237.html