CString的高效版本
来源:互联网 发布:莫扎特圆号协奏曲软件 编辑:程序博客网 时间:2024/06/01 07:36
#pragma once#include <string>template<class T>void SwapFun(T& left, T& right){ T temp = left; left = right; right = temp;}class CShString{public: CShString(char* pStr) :m_iLen(strlen(pStr)) , m_iMaxSize(CalcuMax(m_iLen)) , px(new char[m_iMaxSize]) , pn(new int(1)) { memcpy(px, pStr, m_iLen + 1); } CShString(char* pStr, int iLength) :m_iLen(iLength) , m_iMaxSize(CalcuMax(iLength)) , px(new char[m_iMaxSize]) , pn(new int(1)) { ASSERT(iLength == strlen(pStr)); memcpy(px, pStr, m_iLen); px[m_iLen] = '\0'; } CShString(const CShString& strOther) : px (strOther.px), pn(strOther.pn); { ++*pn; } CShString& Assign(const CShString& other) { Swap(CShString(other.Data(), other.GetLength())); return *this; } CShString& Assign(const char* pStr) { Swap(CShString(pStr)); return *this; } CShString& Assign(const char* pStr, int ilength) { Swap(CShString(pStr, ilength)); return *this; } CShString& Append(const CShString& other) { int nSize = GetLength() + other.GetLength() + 1; char* pStr = new char[nSize]; memcpy(pStr, Data(), GetLength()); memcpy(pStr + GetLength(), other,Data(), other.GetLength() + 1); ResetAs(pStr, nSize); } CShString& Append(const char* pOther) { int nLen = strlen(pOther); int nSize = GetLength() + nLen + 1; char* pStr = new char[nSize]; memcpy(pStr, Data(), GetLength()); memcpy(pStr + GetLength(), pOther, nLen + 1); ResetAs(pStr, nSize); } CShString& Append(const char* pStr, int ilength) { int nSize = GetLength() + ilength + 1; char* pStr = new char[nSize]; memcpy(pStr, Data(), GetLength()); memcpy(pStr + GetLength(), pStr, ilength + 1); ResetAs(pStr, nSize); } ~CShString(void) { if (--*pn == 0) { delete pn; delete px; } } const char* Data() const { return px; } int GetLength() { return m_iLen; }private: void ResetAs(char* pStr, int iSize) { if (--*pn == 0) { delete pn; delete px; } m_iMaxSize = CalcuMax(iSize); m_iLen = iSize - 1; px = pStr; pn = new int(1); } void Swap(CShString& other) { SwapFun(m_iLen, other.m_iLen); SwapFun(m_iMaxSize, other.m_iMaxSize); SwapFun(px, other.px); SwapFun(pn, other.pn); } static int CalcuMax(int iLen) { int i = 0; while (INIT_MAX_LEN + (i++) * DELTA_LEN < iLen + 1){} return INIT_MAX_LEN + (i - 1) * DELTA_LEN; } static const int INIT_MAX_LEN = 100; static const int DELTA_LEN = 20; int m_iLen; int m_iMaxSize; char* px; int* pn;};
阅读全文
0 0
- CString的高效版本
- 分割字符串(CString版本)
- 自己写的share_ptr + Arry 来制作CString共享版本
- 累加和高效并行版本的AAuto串行实现
- javascript高效的判断浏览器种类和版本
- javascript高效的判断浏览器种类和版本
- 微软:Visual Studio 2017是迄今为止最高效的版本
- 高效查表判断胡牌算法的lua版本
- 猜拳游戏--最高效版本
- CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换 (UNICODE版本字符串转换为Ansi版本)
- CString Management (关于CString的所有操作)
- CString::CompareNoCase与CString::Compare的区别
- CString::CompareNoCase与CString::Compare的区别 .
- 一个分页存储过程,Sql2005及以上版本支持(求更高效的分页算法)
- Androidstudio高效管理第三方API的KEY及Gradle版本管理
- 怎么快速高效地查看所用服务器的php版本等所有信息
- CString的使用
- CString 的 Bug(MFC42)
- 自己写的share_ptr + Arry 来制作CString共享版本
- Xcode 使用git管理代码
- Image Resize 双线性和双立方插值法
- Webservice,Soap和Rest
- String、StringBuilder、StringBuffer的不同
- CString的高效版本
- OpenGL ES应用开发实践指南(android 卷)笔记 第四章
- 算法题目---计算数字连续和
- 剑指offer——10.矩形覆盖
- 数据结构之线性表
- 批处理
- vm安装centos6.4
- 自动化Build的方法如下所示
- kubernetes源码之watch包streamwatcher.go阅读理解五