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

时间: 2024-08-05 18:02:24

实现std::string的ltrim、rtrim和trim方法的相关文章

js trim()方法

从字符串中移除前导空格.尾随空格和行终止符. 语法 stringObj.trim() 参数 stringObj 必选.String 对象或字符串.trim 方法不修改该字符串. 返回值 已移除前导空格.尾随空格和行终止符的原始字符串. 备注 移除的字符包括空格.制表符.换页符.回车符和换行符.有关空格和行终止符的完整列表,请参见特殊字符 (JavaScript). 有关说明如何实现你自己的修整方法的示例,请参见原型和原型继承. 下面的示例演示 trim 方法的用法. var message =

ORACLE中的LTRIM、RTRIM和TRIM

LTRIM.RTRIM和TRIM在ORACLE中的用法:1.LTRIM(C1,C2)其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVER不一样的地方.如果记得不错的话SQL Server的LTRIM只有一个参数,作用是去掉字符串左面的空格.而Oracle的LTRIM则是保证C1的第一个字符不能出现在C2字符串中. SQL> select LTRIM( 'Miss Liu', 'Liu') Result  from dual; RESU

js在IE8+兼容String没有trim方法,写一个兼容ie8一下的浏览器的trim()方法

String.prototype.trim = function(){ return Trim(this);}; function LTrim(str) { var i;     for(i=0;i<str.length;i++)     {         if(str.charAt(i)!=" "&&str.charAt(i)!=" ")break;     }     str=str.substring(i,str.length);   

CString、std::string格式化字符串

=============================CString================================== 当有多个字串时,比如     int   n1   =   5;     int   n2   =   10;     char   sz1[]   =   "abcdefg";     char   sz2[]   =   "hijklmn";         用std中的string如何写出最简单的代码得到MFC中CStr

C++命名空间和头文件的关系 例如已经使用了#include&lt;string&gt;,为什么还要 using std::string?

(1)如果C++程序中使用了带后缀".h"的头文件,那么不必在程序中声明命名空间,只需要文件中包含头文件即可:(2)C++标准要求系统提供的头文件不带后缀".h",但为了表示C++与C的头文件既有联系又有区别,C++中所用头文件不带后缀".h",而是在C语言的相应头文件名之前加上前缀c: (3)自定义的头文件通常带后缀“.h",系统标准库文件不带后缀“.h". (4)因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很

std::string 和 CString问题

std::string stdTemp; CString strTemp; strTemp = stdTemp;    ;//这一步直接赋值可不可以 因为CString可以接受const char*的赋值,而且std::string有个返回const char*的方法,c_str(),所以,应该这样写: strTemp = stdTemp.c_str();

QString、std::string转换成char*

#include <iostream> #include <QtCore/QString> int main() { QString str_Q("cupcupy北京"); int j = str_Q.length(); //11,一个汉字算两个字符 std::string str_string = str_Q.toStdString(); int i = str_string.length();//11,字符串长度不包括结尾的'/0' //c_str()返回的

c++ istream转换为std::string

std::istreambuf_iterator<char> eos; std::string s(std::istreambuf_iterator<char>(stream), eos);---------------------------------------------------------------------------- (could be a one-liner if not for MVP) post-2011 edit, this approach is

源码阅读笔记 &ndash; 3 std::string 与 Short String Optimization

众所周知,大部分情况下,操作一个自动(栈)变量的速度是比操作一个堆上的值的速度快的.然而,栈数组的大小是在编译时确定的(不要说 C99 的VLA,那货的 sizeof 是运行时计算的),但是堆数组的大小在运行时确定,很自由.此外,栈空间比堆空间有限,前者只有几MB,而后者基本上就是你系统内存的大小. 正因为这样,我们想组合两者的优势,既要享受堆空间的自由,又想要在数组较小的时候使用栈空间来加快速度,并且结合两者不会产生额外的开销,这时候,我们需要Short String Optimization