STL字符串常用方法扩展
2015-09-08 20:10
375 查看
前言
STL作为一个标准模版库,很多容器和算法都是很实用的,接口也相对比较友好,而且在实现上也比较轻量级。相对boost来说,要轻量得多,相对loki来说,使用的模版语法不会那么晦涩难懂,基本还是能看的,相对ATL来说,功能要更通用。但是STL里面的string,使用过的都知道,很多常用方法没有内置,导致每每使用都会想起CString和AtlString的强大来,而混用这些字符串对象,对于一个有洁癖的程序员来说,往往是很不爽的。在工作过程中,因为有些场景不能使用CString和AtlString,针对STL的string,通过基本函数的方式,实现(积累)了一些常用用法,这里简单分享给大家。
常用方法集
大小写转换Trim
移除子串
替换子串
StartWith & EndWith
字符串反转
容器字符串连接
字符串分割
代码
/* ------------------------------------------------------------------------- // 文件名 : QMStlStrUtil.h // 创建者 : magic // 创建时间 : 2015/9/1 17:09:32 // 功能描述 : STL字符串通用方法(大小写,trim,替换,删除,连接,分割,反转等) // // $Id: $ // -----------------------------------------------------------------------*/ #ifndef __QMSTLSTRUTIL_H__ #define __QMSTLSTRUTIL_H__ #include <string> #include <numeric> #include <algorithm> // ------------------------------------------------------------------------- namespace Util { namespace StlStr { ////////////////////////////////////////////////////////////////////////// // 字符串大小写转换 // // ------------------------------------------------------------------------- // 函数 : ToUpperT // 功能 : 转换成大写 // 返回值 : inline void // 参数 : std::basic_string<CharT>& s // 附注 : // ------------------------------------------------------------------------- template<typename CharT> inline void ToUpper(std::basic_string<CharT>& s); template<> inline void ToUpper(std::basic_string<char>& s) { transform(s.begin(), s.end(), s.begin(), toupper); } template<> inline void ToUpper(std::basic_string<wchar_t>& s) { transform(s.begin(), s.end(), s.begin(), toupper); } // ------------------------------------------------------------------------- // 函数 : ToUpperT // 功能 : 转换成大写 // 返回值 : inline std::basic_string<CharT> // 参数 : const std::basic_string<CharT>& s // 附注 : 重载版本,参数为const // ------------------------------------------------------------------------- template<typename CharT> inline std::basic_string<CharT> ToUpperT(const std::basic_string<CharT>& s) { std::basic_string<CharT> str(s); transform(str.begin(), str.end(), str.begin(), toupper); return str; } // ------------------------------------------------------------------------- // 函数 : ToLowerT // 功能 : 转换成小写 // 返回值 : inline void // 参数 : std::basic_string<CharT>& s // 附注 : // ------------------------------------------------------------------------- template<typename CharT> inline void ToLower(std::basic_string<CharT>& s); template<> inline void ToLower(std::basic_string<char>& s) { transform(s.begin(), s.end(), s.begin(), tolower); } template<> inline void ToLower(std::basic_string<wchar_t>& s) { transform(s.begin(), s.end(), s.begin(), tolower); } // ------------------------------------------------------------------------- // 函数 : ToLowerT // 功能 : 转换成小写 // 返回值 : inline std::basic_string<CharT> // 参数 : const std::basic_string<CharT>& s // 附注 : 重载版本,参数为const // ------------------------------------------------------------------------- template<typename CharT> inline std::basic_string<CharT> ToLowerT(const std::basic_string<CharT>& s) { std::basic_string<CharT> str(s); transform(str.begin(), str.end(), str.begin(), tolower); return str; } ////////////////////////////////////////////////////////////////////////// // 移除字符串前后空白符 // ////////////////////////////////////////////////////////////////////////// // 空白符枚举 // // "\0" - NULL // "\t" - 制表符 // "\n" - 换行 // "\x0B" - 垂直制表符 // "\r" - 回车 // " " - 空格 // ////////////////////////////////////////////////////////////////////////// // TrimLeft // template<typename CharT> inline void TrimLeft(std::basic_string<CharT>& s); template<> inline void TrimLeft(std::basic_string<char>& s) { const char* p = " \t\n\r\x0b"; s.erase(0, s.find_first_not_of(p)); } template<> inline void TrimLeft(std::basic_string<wchar_t>& s) { const wchar_t* p = L" \t\n\r\x0b"; s.erase(0, s.find_first_not_of(p)); } template<typename CharT> inline void TrimLeftEx(std::basic_string<CharT>& s, const std::basic_string<CharT>& charlist); template<> inline void TrimLeftEx(std::basic_string<char>& s, const std::basic_string<char>& charlist) { s.erase(0, s.find_first_not_of(charlist)); } template<> inline void TrimLeftEx(std::basic_string<wchar_t> &s, const std::basic_string<wchar_t>& charlist) { s.erase(0, s.find_first_not_of(charlist)); } ////////////////////////////////////////////////////////////////////////// // TrimRight // template<typename CharT> inline void TrimRight(std::basic_string<CharT>& s); template<> inline void TrimRight(std::basic_string<char>& s) { const char* p = " \t\n\r\x0b"; s.erase(s.find_last_not_of(p) + 1); } template<> inline void TrimRight(std::basic_string<wchar_t>& s) { const wchar_t* p = L" \t\n\r\x0b"; s.erase(s.find_last_not_of(p) + 1); } template<typename CharT> inline void TrimRightEx(std::basic_string<CharT>& s, const std::basic_string<CharT>& charlist); template<> inline void TrimRightEx(std::basic_string<char>& s, const std::basic_string<char>& charlist) { s.erase(s.find_last_not_of(charlist) + 1); } template<> inline void TrimRightEx(std::basic_string<wchar_t> &s, const std::basic_string<wchar_t>& charlist) { s.erase(s.find_last_not_of(charlist) + 1); } ////////////////////////////////////////////////////////////////////////// // Trim // template<typename CharT> inline void Trim(std::basic_string<CharT>& s); template<> inline void Trim(std::basic_string<char>& s) { const char* p = " \t\n\r\x0b"; s.erase(0, s.find_first_not_of(p)); s.erase(s.find_last_not_of(p) + 1); } template<> inline void Trim(std::basic_string<wchar_t>& s) { const wchar_t* p = L" \t\n\r\x0b"; s.erase(0, s.find_first_not_of(p)); s.erase(s.find_last_not_of(p) + 1); } template<typename CharT> inline void TrimEx(std::basic_string<CharT>& s, const std::basic_string<CharT>& charlist); template<> inline void TrimEx(std::basic_string<char>& s, const std::basic_string<char>& charlist) { s.erase(0, s.find_first_not_of(charlist)); s.erase(s.find_last_not_of(charlist) + 1); } template<> inline void TrimEx(std::basic_string<wchar_t> &s, const std::basic_string<wchar_t>& charlist) { s.erase(0, s.find_first_not_of(charlist)); s.erase(s.find_last_not_of(charlist) + 1); } ////////////////////////////////////////////////////////////////////////// // Erase 删除字符串里面的某个特殊字符 // add by magic 2015/9/7 17:43:10 // template<typename CharT> inline void Erase(std::basic_string<CharT>& s, const CharT& chErase); template<> inline void Erase(std::basic_string<char>& s, const char& chErase); template<> inline void Erase(std::basic_string<wchar_t>& s, const wchar_t& chErase); template<typename CharT> void Erase(std::basic_string<CharT>& s, const std::basic_string<CharT>& strErase); template<> void Erase(std::basic_string<char>& s, const std::basic_string<char>& strErase); template<> void Erase(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& strErase); ////////////////////////////////////////////////////////////////////////// // Replace 替换子串为另外的子串 // template<typename CharT> void Replace(std::basic_string<CharT>& s, const std::basic_string<CharT>& src, const std::basic_string<CharT>& dest); template<> void Replace(std::basic_string<char>& s, const std::basic_string<char>& src, const std::basic_string<char>& dest); template<> void Replace(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& src, const std::basic_string<wchar_t>& dest); ////////////////////////////////////////////////////////////////////////// // StartWith & EndWith // template<typename CharT> inline bool StartWith(std::basic_string<CharT>& s, const std::basic_string<CharT>& head); template<> inline bool StartWith(std::basic_string<char>& s, const std::basic_string<char>& head) { if (s.size() < head.size()) return false; return (0 == s.compare(0, head.size(), head)); } template<> inline bool StartWith(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& head) { if (s.size() < head.size()) return false; return (0 == s.compare(0, head.size(), head)); } template<typename CharT> inline bool EndWith(std::basic_string<CharT>& s, const std::basic_string<CharT>& tail); template<typename CharT> inline bool EndWith(std::basic_string<char>& s, const std::basic_string<char>& tail) { if (s.size() < tail.size()) return false; return (0 == s.compare(s.size() - tail.size(), tail.size(), tail)); } template<typename CharT> inline bool EndWith(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& tail) { if (s.size() < tail.size()) return false; return (0 == s.compare(s.size() - tail.size(), tail.size(), tail)); } template<typename CharT> bool StartWithI(std::basic_string<CharT>& s, const std::basic_string<CharT>& head); template<> bool StartWithI(std::basic_string<char>& s, const std::basic_string<char>& head); template<> bool StartWithI(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& head); template<typename CharT> bool EndWithI(std::basic_string<CharT>& s, const std::basic_string<CharT>& tail); template<> bool EndWithI(std::basic_string<char>& s, const std::basic_string<char>& tail); template<> bool EndWithI(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& tail); ////////////////////////////////////////////////////////////////////////// // 字符串反转 // template<typename CharT> inline void Reverse(std::basic_string<CharT>& s); template<> inline void Reverse(std::basic_string<char>& s) { std::reverse(s.begin(), s.end()); } template<> inline void Reverse(std::basic_string<wchar_t>& s) { std::reverse(s.begin(), s.end()); } template<typename CharT> inline std::basic_string<CharT> Reverse(const std::basic_string<CharT>& s); template<> inline std::basic_string<char> Reverse(const std::basic_string<char>& s) { std::basic_string<char> _s(s.rbegin(), s.rend()); return _s; } template<> inline std::basic_string<wchar_t> Reverse(const std::basic_string<wchar_t>& s) { std::basic_string<wchar_t> _s(s.rbegin(), s.rend()); return _s; } ////////////////////////////////////////////////////////////////////////// // 容器字符串连接 // template<typename CharT, template<typename S, typename Q = std::allocator<S> > class Container> inline std::basic_string<CharT> Join(const Container<std::basic_string<CharT> >& c); template<template<typename S, typename Q = std::allocator<S> > class Container> inline std::basic_string<char> Join(const Container<std::basic_string<char> >& c) { return std::accumulate(c.begin(), c.end(), std::basic_string<char>()); } template<template<typename S, typename Q = std::allocator<S> > class Container> inline std::basic_string<wchar_t> Join(const Container<std::basic_string<wchar_t> >& c) { return std::accumulate(c.begin(), c.end(), std::basic_string<wchar_t>()); } ////////////////////////////////////////////////////////////////////////// // 字符串分割 // // ------------------------------------------------------------------------- // 函数 : Split // 功能 : 分割STL标准字符串 // 返回值 : void // 参数 : Container<std::basic_string<CharT> >& v 存放分割结果 // 参数 : const std::basic_string<CharT>& s 待分割字符串 // 参数 : const std::basic_string<CharT>& c 分割字符串 // 附注 : // ------------------------------------------------------------------------- template<typename CharT, template<typename S, typename Q = std::allocator<S> > class Container> void Split(Container<std::basic_string<CharT> >& v, const std::basic_string<CharT>& s, const std::basic_string<CharT>& c); template<template<typename S, typename Q = std::allocator<S> > class Container> void Split(Container<std::basic_string<char> >& v, const std::basic_string<char>& s, const std::basic_string<char>& c) { if (0 == c.length()) return; std::basic_string<char>::size_type pos1 = 0; std::basic_string<char>::size_type pos2 = 0; pos1 = 0; pos2 = s.find(c); while (std::basic_string<char>::npos != pos2) { v.push_back(s.substr(pos1, pos2 - pos1)); pos1 = pos2 + c.size(); pos2 = s.find(c, pos1); } if (pos1 != s.length()) { v.push_back(s.substr(pos1)); } } template<template<typename S, typename Q = std::allocator<S> > class Container> void Split(Container<std::basic_string<wchar_t> >& v, const std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& c) { if (0 == c.length()) return; std::basic_string<wchar_t>::size_type pos1 = 0; std::basic_string<wchar_t>::size_type pos2 = 0; pos1 = 0; pos2 = s.find(c); while (std::basic_string<wchar_t>::npos != pos2) { v.push_back(s.substr(pos1, pos2 - pos1)); pos1 = pos2 + c.size(); pos2 = s.find(c, pos1); } if (pos1 != s.length()) { v.push_back(s.substr(pos1)); } } } // End Namespace StlStr } // End Namespace Util // ------------------------------------------------------------------------- // $Log: $ #endif /* __QMSTLSTRUTIL_H__ */
/* ------------------------------------------------------------------------- // 文件名 : QMStlStrUtil.cpp // 创建者 : magic // 创建时间 : 2015/9/1 17:09:36 // 功能描述 : // // $Id: $ // -----------------------------------------------------------------------*/ #include "stdafx.h" #include "QMStlStrUtil.h" // ------------------------------------------------------------------------- namespace Util { namespace StlStr { template<> inline void Erase(std::basic_string<char>& s, const char& chErase) { s.erase(remove_if(s.begin(), s.end(), bind2nd(std::equal_to<char>(), chErase)), s.end()); } template<> inline void Erase(std::basic_string<wchar_t>& s, const wchar_t& chErase) { s.erase(remove_if(s.begin(), s.end(), bind2nd(std::equal_to<wchar_t>(), chErase)), s.end()); } template<> void Erase(std::basic_string<char>& s, const std::basic_string<char>& strErase) { std::basic_string<char>::size_type pos = 0; while (true) { pos = s.find(strErase, pos); if (std::basic_string<char>::npos == pos) break; s.erase(pos, strErase.size()); } } template<> void Erase(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& strErase) { std::basic_string<wchar_t>::size_type pos = 0; while (true) { pos = s.find(strErase, pos); if (std::basic_string<wchar_t>::npos == pos) break; s.erase(pos, strErase.size()); } } template<> void Replace(std::basic_string<char>& s, const std::basic_string<char>& src, const std::basic_string<char>& dest) { std::basic_string<char>::size_type pos = 0; while (true) { pos = s.find(src, pos); if (std::basic_string<char>::npos == pos) break; s.replace(pos, src.size(), dest); pos += src.size(); } } template<> void Replace(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& src, const std::basic_string<wchar_t>& dest) { std::basic_string<wchar_t>::size_type pos = 0; while (true) { pos = s.find(src, pos); if (std::basic_string<wchar_t>::npos == pos) break; s.replace(pos, src.size(), dest); pos += src.size(); } } template<> bool StartWithI(std::basic_string<char>& s, const std::basic_string<char>& head) { if (s.size() < head.size()) return false; std::basic_string<char> _s = s.substr(0, head.size()); std::basic_string<char> _head = head; ToLower(_s); ToLower(_head); return (0 == _s.compare(0, _head.size(), _head)); } template<> bool StartWithI(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& head) { if (s.size() < head.size()) return false; std::basic_string<wchar_t> _s = s.substr(0, head.size()); std::basic_string<wchar_t> _head = head; ToLower(_s); ToLower(_head); return (0 == _s.compare(0, _head.size(), _head)); } template<> bool EndWithI(std::basic_string<char>& s, const std::basic_string<char>& tail) { if (s.size() < tail.size()) return false; std::basic_string<char> _s = s.substr(s.size() - tail.size(), tail.size()); std::basic_string<char> _tail = tail; ToLower(_s); ToLower(_tail); return (0 == _s.compare(0, _tail.size(), _tail)); } template<> bool EndWithI(std::basic_string<wchar_t>& s, const std::basic_string<wchar_t>& tail) { if (s.size() < tail.size()) return false; std::basic_string<wchar_t> _s = s.substr(s.size() - tail.size(), tail.size()); std::basic_string<wchar_t> _tail = tail; ToLower(_s); ToLower(_tail); return (0 == _s.compare(0, _tail.size(), _tail)); } } // End Namespace StlStr } // End Namespace Util // ------------------------------------------------------------------------- // $Log: $
![](http://img.tongji.linezing.com/3587820/tongji.gif)
相关文章推荐
- Android使用第三方或者自制字体库(Typespace)
- Linux重启网卡的3种方式
- 1024. 科学计数法 (20)
- Effective C++——条款30(第5章)
- 测试-是否会出现一帧调用多次Update或FixedUpdate的情况
- MATLAB:读取文本数据并排序
- Nginx进程分析(worker_process篇)
- 怎样理解Servlet的单实例多线程
- java
- 学习任务
- 【WPF】—StackPanel && Grid 初识布局容器(1)
- tabBarItem setBadgeValue 样式自定义(IOS)
- 更新财务报表2
- STL之map容器的详解
- 让网站网址实现百度秒收录
- 通过迁移的方式解决Active Directory服务器问题之1-迁移前的准备工作
- python 生成器
- hadoop2.x的HA简介
- struct和typedef struct
- hdu 2120 Ice_cream's world I