实现简单的string类
摘要
实现了一个string类,包括基本的构造、赋值、判断、大小写等。
String API
Constructors
string();
string(const char& ch);
string(const char* str);
string(const string& str);
Informational Methods
unsigned Length() const;
int Index(char c) const;
Case Methods
void UpCase(unsigned first, unsigned last);
void LowCase(unsigned first, unsigned last);
Stream Operators
friend std::ostream& operator<<(std::ostream& os, const string& str);
friend std::istream& operator>>(std::istream& is, string& str);
Accessor Operators
const char& operator[](unsigned i) const;
char& operator[](unsigned i);
Assignment Operators
String& operator= (const String&)
String& operator+= (const String&)
String Concatenation
friend string operator+(const string& lhs, const string& rhs);
friend string operator+(const string& lhs, const char* rhs);
friend string operator+(const char* lhs, const string& rhs);
Logical Operators
friend bool operator==(const string& lhs, const string& rhs);
friend bool operator!=(const string& lhs, const string& rhs);
friend bool operator<(const string& lhs, const string& rhs);
friend bool operator>(const string& lhs, const string& rhs);
#include "string.h"
using namespace vlyf;
inline
vlyf::string::string()
{
length = 0;
data = new char[0];
}
inline
string::string(const char* str)
{
if (str)
{
unsigned n = 0;
while (str[n] != '\0') n++;
data = new char[n];
length = n;
for (unsigned i = 0; i < n; i++)
{
data[i] = str[i];
}
}
else
{
length = 0;
data = new char[0];
}
}
inline
string::string(const string& str)
{
unsigned len = str.Length();
length = len;
data = new char[len];
for (unsigned i = 0; i < len; i++)
{
data[i] = str[i];
}
}
inline
string::~string()
{
delete[]data;
}
inline
unsigned string::Length() const
{
return length;
}
int string::Index(char c) const
{
for (unsigned i = 0; i < Length(); i++)
{
if (c == data[i]) return i;
}
return -1;
}
inline
void string::UpCase(unsigned first, unsigned last)
{
while (first++ < last)
{
if ('a' <= data[first] && data[first] <= 'z')
data[first] -= ('a' - 'A');
}
}
inline
void string::LowCase(unsigned first, unsigned last)
{
while (first++ < last)
{
if ('A' <= data[first] && data[first] <= 'Z')
data[first] += ('a' - 'A');
}
}
const char& vlyf::string::operator[](unsigned i) const
{
return data[i];
}
char& vlyf::string::operator[](unsigned i)
{
return data[i];
}
string& vlyf::string::operator=(const char* s)
{
char* temp = data; //保存原本数据,确保异常安全性
unsigned n = 0;
while (s[n] != '\0')
n++;
length = n;
data = new char[n];
for (unsigned i = 0; i < n; i++)
data[i] = s[i];
delete[] temp;
return *this;
}
inline
string& vlyf::string::operator=(const string& str)
{
if (this == &str) return *this;
char* temp = str.data; //保存原本数据,确保异常安全性
unsigned len = str.Length();
data = new char[len];
for (unsigned i = 0; i < len; i++)
data[i] = str[i];
length = len;
delete[] temp;
return *this;
}
inline
string& string::operator+=(const string& str)
{
unsigned len = length + str.Length();
char* ss = new char[len];
for (unsigned i = 0; i < Length(); i++)
ss[i] = data[i];
for (unsigned i = 0; i < str.Length(); i++)
ss[i + length] = str[i];
delete[]data;
data = ss;
length = len;
return *this;
}
std::ostream& vlyf::operator<<(std::ostream& os, const string& str)
{
if (str.Length() > 0)
{
for (unsigned i = 0; i < str.Length(); i++)
os << str[i];
}
else
{
os << "";
}
return os;
}
std::istream& vlyf::operator>>(std::istream& is,string& str)
{
char* ss = new char[1000];
is >> ss;
str = string(ss);
return is;
}
string vlyf::operator+(const string& lhs, const string& rhs)
{
return string(lhs) += rhs;
}
string vlyf::operator+(const string& lhs, const char* rhs)
{
return string(lhs) += string(rhs);
}
string vlyf::operator+(const char* lhs, const string& rhs)
{
return string(lhs) += string(rhs);
}
bool vlyf::operator==(const string& lhs, const string& rhs)
{
if (lhs.Length() != rhs.Length())
return false;
unsigned n = 0;
unsigned len = lhs.Length();
while (lhs[n] == rhs[n] && len != n)
n++;
return n == len;
}
bool vlyf::operator!=(const string& lhs, const string& rhs)
{
if (lhs.Length() != rhs.Length())
return true;
unsigned n = 0;
unsigned len = lhs.Length();
while (lhs[n] == rhs[n] && len != n)
n++;
return n != len;
}
bool vlyf::operator<(const string& lhs, const string& rhs)
{
unsigned min = (lhs.Length() < rhs.Length()) ? lhs.Length() : rhs.Length();
unsigned n = 0;
while (lhs[n] == rhs[n] && n != min)
n++;
if (n == min) return lhs.Length() < rhs.Length();
else
{
if (lhs[n] < rhs[n])
return lhs.Length() < rhs.Length();
else
return lhs.Length() > rhs.Length();
}
}
bool vlyf::operator>(const string& lhs, const string& rhs)
{
return lhs < rhs;
}
int main()
{
string s1 = "123";
std::cout << "s1:" << s1 << " length: " << s1.Length() << std::endl;
string s2("456");
std::cout << "s2:" << s2 << " length: " << s2.Length() << std::endl;
string s3(s1);
std::cout << "s3:" << s3 << " length: " << s3.Length() << std::endl;
string s4 = s3;
std::cout << "s4:" << s4 << " length: " << s4.Length() << std::endl;
string s5(s1);
s5 += s2;
std::cout << "s5:" << s5 << " length: " << s5.Length() << std::endl;
string s6(s5);
std::cout << "s6:" << s6 << " length: " << s6.Length() << std::endl;
if (s5 == s6) std::cout << "s5 == s6: true" << std::endl;
string s7 = s1 + "456";
std::cout << "s7:" << s7 << " length: " << s7.Length() << std::endl;
string s8 = "456" + s1;
std::cout << "s8:" << s8 << " length: " << s8.Length() << std::endl;
string s9 = s7 + s8;
std::cout << "s9:" << s9 << " length: " << s9.Length() << std::endl;
return 0;
}
实现简单的string类的更多相关文章
- 自己实现简单的string类
1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...
- 一个简单的string类,读书看报系列(一)
对于这个类,写过程序的都知道应该含有的方法是 初始化.销毁.拼接.求长度.清除.判断是否为空等.还有一些操作符重载 一.先看初始化: 可以想到应该有默认构造的的.带有字符串的.带有默认字符的.还有一个 ...
- 【c++】简单的string类的几个基本函数
// string的几个基本函数的实现 #include <iostream> #include <assert.h> #include <string.h> us ...
- 【Java】整理关于java的String类,equals函数和比较操作符的区别
初学 Java 有段时间了,感觉似乎开始入了门,有了点儿感觉但是发现很多困惑和疑问而且均来自于最基础的知识折腾了一阵子又查了查书,终于对 String 这个特殊的对象有了点感悟大家先来看看一段奇怪的程 ...
- c++在string类源
一:回想 (1)c++中的string类是在面试中和笔试中常常考的题目: project代码免费下载 string类的自行实现 (2)c++中的string类和fstream类合起来是处理外部数据的利 ...
- 全面深入介绍C++字符串:string类
http://blog.csdn.net/liuliming3000/article/details/1809385 1 从C到C++ string类 2 string类的构造函数 3 string类 ...
- C++标准模板库Stand Template Library(STL)简介与STL string类
参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...
- C++ char数组和string类简单使用总结
使用char数组,进行字符串的操作,是c风格的操作方式. string是C++的风格,感觉string本质上就是一个vector<char> 以下代码详细展示了字符串的常见操作 #incl ...
- c++string类的简单介绍
#include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...
随机推荐
- 微服务学习之路(三)——实现RPC远程服务调用
RPC(Remote Producedure Call)调用原理:服务消费者称为客户端,服务提供者称为服务端,处于不同网络地址,需要建立网络连接.建立连接后,双方还必须按照某种约定的协议进行网络通讯— ...
- spark延迟调度与动态资源管理
Spark中的延迟调度 Spark的Task的调度过程有五个本地性级别:PROCESS_NODE.NODE_LOCAL.NO_PREF.RACK_LOCAL.ANY.在理想的状态下,我们肯定是想所有的 ...
- 单片机模块化程序: 单片机加入JSON是个不错的选择
这节需要知道的知识点 https://www.cnblogs.com/yangfengwu/p/11685325.html 下载JSON文件: 链接: https://sourcefo ...
- 浅谈LCA
目录 什么是LCA 倍增求LCA dfs bfs 树剖求LCA 什么是LCA LCA就是最近公共祖先 对于有根树\(Tree\)的两个结点\(u.v\),最近公共祖先\(LCA(T,u,v)\)表示一 ...
- 可持久化0-1Trie树
我跟可持久化数据结构杠上了 \(QwQ\) .三天模拟赛考了两次可持久化数据结构(主席树.可持久化0-1Trie树),woc. 目录: 个人理解 时空复杂度分析 例题及简析 一.个人理解 可持久化0- ...
- 2019.10.1 qbxt模拟题
第一题 考虑树上\(DP\),f[i][j][0/1]表示以\(i\)为根的子树,入读为零点的个数为\(j\),点\(i\)的入度为\(0\)/不为\(0\)时的方案数 转移的时候考虑\(u\)的一个 ...
- Android Studio 之 SharedPrefences 数据持久性保存
SharedPreferences 会在应用包目录中生成一个xml文件,将数据保存在里面 可以实现数据持久性保存. 创建的数据,保存在 Data -> Data -> 包名 -> s ...
- 一种Winform类electron的实现
最近看了一篇文章 Winform客户端内嵌Vue页面 使用html作为winform的界面(其实这种做法早在MFC时代就已经有了),不过感觉文章中的封装并不够彻底,所以我忍不住要发一篇博客来说说我 ...
- 【技术博客】基于JsPlumb和JQuery-UI的流程图的保存和再生成
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. 基于JsPlumb和JQuery-UI的流程图的保存和再生 ...
- 冰多多团队-第七次scrum例会
冰多多团队-第七次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 zpj 接入IAT模块 debug, IAT 牛雅哲 调研科大讯飞SDK中其他模块,寻找符合我们的需求的部分,将接口更换成 ...