STL字符串常用方法扩展
来源:互联网 发布:与av淘宝一样的网站 编辑:程序博客网 时间:2024/05/16 19:37
前言
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: $
0 0
- STL字符串常用方法扩展
- C# 一些常用的字符串扩展方法
- STL,map常用方法
- STL常用方法
- STL常用方法
- JS字符串方法扩展
- JS字符串方法扩展
- 字符串方法的扩展
- Linq常用扩展方法
- 常用扩展方法总结
- 【STL】常用容器的方法
- STL容器的常用方法
- 【STL】list的常用方法
- 【STL】list的常用方法
- 【STL】deque的常用方法
- STL常用方法速记总结
- 扩展字符串左右对齐方法
- 扩展字符串左右对齐方法
- 等价类划分--三角形测试用例设计
- Linux重启网卡的3种方式
- 1025. 反转链表 (25)
- [APUE]再读之进程间通信
- Maven 发布jar包到远程仓库
- STL字符串常用方法扩展
- Java语言程序设计 学习作业2.6**分离个十百位数求和
- 题目1388:跳台阶 -- 简单的动归 注意数据范围
- Linux 配置收集2 - Some Configuration In Ubuntu14.04.02 And EOS
- JAVA上机——2.6
- LeetCode 278--First Bad Versionx先判断
- C++ Primer Plus 第6版 中文版 第5章编程练习
- 敏捷:敏捷的价值
- hdu 2604 汉诺塔III 递推