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”,但是我个人更喜欢使用自定义函数而不是复合使用模板。

  • 相关阅读:
    2251: [2010Beijing Wc]外星联络
    1500 后缀排序
    1492: [NOI2007]货币兑换Cash【CDQ分治】
    P3380 【模板】二逼平衡树(树套树)
    python opencv
    pycharm调试
    pycharm中选择python interpreter
    创建使用pycharm virtualenv
    reload函数
    python3编写发送四种http请求的脚本
  • 原文地址:https://www.cnblogs.com/mopno1/p/4848237.html
Copyright © 2011-2022 走看看