zoukankan      html  css  js  c++  java
  • 实现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”,但是我个人更喜欢使用自定义函数而不是复合使用模板。

  • 相关阅读:
    初次接触json...
    vector algorithm find
    网站安全(13) ——目录穿越漏洞(Directory Traversal)
    网站安全(20) —— 语义URL攻击
    网站安全(7) —— PHP文件包含漏洞介绍
    让PHP更快的提供文件下载
    PHP中关于include()和require() 的区别问题
    PHP中 获取全路径的文件的扩展名
    MySQL varchar计算:求列的数目和计算N的最大值
    jmeter使用分享
  • 原文地址:https://www.cnblogs.com/mopno1/p/4848237.html
Copyright © 2011-2022 走看看