Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

用STL实现Boost的trim,trim_copy,trim_copy_if,trim_left_copy_if等

$
0
0

头文件:BoostTrim.h

#pragma once
#include <string>
using namespace std;

//此名称空间的函数说明
//trim:删除字符串两端的空白符
//trim_copy:返回字符串删除两端空白符之后的新字符串,不改变原字符串
//trim_copy_if:返回字符串删除两端符合条件判断的字符,返回删除之后的新字符串,不改变原来字符串
//right:只删除右端的
//left:只删除左端的
namespace BoostTrim
{
	//判断一个char是否为空白符
	inline	bool is_space( char t )
	{
		return ( t==char(9) /*HT*/ || t==char(10)  || t==char(11)  || t==char(13) || t==char(32)/*space*/ );
	}

	template<typename Fun>
	inline void trim_left_if(string& Input, Fun is_space)
	{
		for (string::iterator i=Input.begin(); i!=Input.end();)
		{
			if (is_space(*i))
			{
				i=Input.erase(i);
				continue;
			}
			else
			{
				break;
			}
		}
	}

	template<typename Fun>
 	inline string trim_left_copy_if(const string& Input, Fun is_space )
	{
		string str;
		for (string::const_iterator i=Input.begin(); i!=Input.cend();)
		{
			if (is_space(*i))
			{
				++i;
			}
			else
			{
				return string(i,Input.cend());
			}
		}
		return string();
	}
 	
	inline string trim_left_copy(const string& Input)
	{
		return trim_left_copy_if(Input,is_space);
	}
 	
	inline 	void trim_left(string& Input)
	{
		trim_left_if(Input,is_space);
	}

	template<typename Fun>
	inline void trim_right_if(string& Input, Fun is_space)
	{
		size_t i = Input.size()-1;
		for (; i!= -1; --i)
		{
			if (is_space(Input[i]))
			{
				continue;
			}
			else 
			{
				break;
			}
		}
		Input.erase(i+1);
	}

	template<typename Fun>
	inline string trim_right_copy_if(const string& Input, Fun is_space )
	{
		size_t i = Input.size()-1;
		for (; i!= -1; --i)
		{
			if (is_space(Input[i]))
			{
				continue;
			}
			else 
			{
				break;
			}
		}

		string result1;
		for (;i!=-1;--i)
		{
			result1.push_back(Input[i]);
		}
		return result1;
	}

	inline string trim_right_copy(const string& Input)
	{
		trim_right_copy_if(Input,is_space);
	}


 	inline 	void trim_right(string& Input)
	{
		trim_right_if(Input,is_space);		
	}

	template<typename Fun>
	inline void trim_if(string& Input, Fun is_space)
	{
		trim_left_if(Input,is_space);
		trim_right_if(Input,is_space);		
	}

	inline void trim(string& str)
	{
		trim_left(str);
		trim_right(str);
	}

	template<typename Fun>
 	inline string trim_copy_if(const string& Input, Fun is_space)
	{
		return trim_right_copy_if(trim_left_copy_if(Input,is_space),is_space);
	}

	inline string trim_copy(const string& Input)
	{
		return trim_copy_if(Input,is_space);
	}

}

测试文件:main.cpp

#include <iostream>
#include "BoostTrim.h"
//输出一个对象,两边加“|”用来标明字符串的两端
template<typename T>
void p(const T& s)
{
	cout<<"|"<<s<<"|"<<endl;
}
//判断一个字符是否为“*”,用来测试函数对象
bool is_star(char c)
{
	return (c=='*');
}
//测试程序
int main()
{
	string s="   \t   \n sdj***falkdf  kd	f*s * \n \t \r   ";
	p(s);
 	//BoostTrim::trim_left_if(s,BoostTrim::is_space);
 	//BoostTrim::trim_left_if(s,is_star);
	//BoostTrim::trim_left(s);
	//BoostTrim::trim_right_if(s,BoostTrim::is_space);
	//BoostTrim::trim_right_if(s,is_star);
	//BoostTrim::trim_right(s);
	//BoostTrim::trim(s);
	//BoostTrim::trim_if(s,BoostTrim::is_space);
	//BoostTrim::trim_if(s,is_star);
	//string s1=trim_left_copy_if(s,BoostTrim::is_space);
	//string s1=trim_left_copy(s);
	//string s1=trim_right_copy_if(s,BoostTrim::is_space);
	//string s1=trim_right_copy(s);
	//string s1=trim_copy_if(s,BoostTrim::is_space);
	string s1=trim_copy(s);
	p(s1);
}


希望大家能给出改进意见!

作者:ClamReason 发表于2013-11-29 1:00:49 原文链接
阅读:109 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>