标签:
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”,但是我个人更喜欢使用自定义函数而不是复合使用模板。
实现std::string的ltrim、rtrim和trim方法
标签:
原文地址:http://www.cnblogs.com/mopno1/p/4848237.html