实现简单的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: ...
随机推荐
- Oracle执行过程中出现的问题
ORA-02292: 违反完整约束条件 (用户名.约束名) - 已找到子记录 造成原因:删除该表时,有依赖该表的子表数据,需要删除该条记录或者禁用约束. 查看约束所在的表:select * from ...
- vue cli4.0 配置环境变量
温馨提示:本文只适用于vue-cli 3.0 及以上的版本哦~ ------------------正文开始------------------ 开发项目时,经常会需要在不同环境中切换.那么我们如何配 ...
- 第3章 Spring AOP
3.1 Spring AOP简介 3.11什么是AOP? AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程).它是面向对象编程(OOP)的一种补充 ...
- vue.js双向绑定之--select获取text
在大多数情况下select下拉菜单都是value和text设置不同的值的,value一般来说是与后台交互的值,而text是前端用来显示的文本: 但是,vue.js对到表单的双向绑定时如果option设 ...
- Connected Component in Undirected Graph
Description Find connected component in undirected graph. Each node in the graph contains a label an ...
- idea中隐藏.iml文件
在创建父子工程或者聚合工程时产生的大量 .iml 文件,有时会对我们的操作产生干扰,所以,一般情况下,我们都将其隐藏掉,步骤如下: File——>settings——>Editor——&g ...
- Good Article Good sentence HDU - 4416 (后缀数组)
Good Article Good sentence \[ Time Limit: 3000 ms\quad Memory Limit: 32768 kB \] 题意 给出一个 \(S\) 串,在给出 ...
- 线程太多导致socket连接池爆满,进程启动不了
Issue: 某部机上跟其它机器的连接有问题,ping可以通,telnet端口不通,可以其它机器可以连接到该机器上的进程. java应用启动不起来,产生以下错误. java.net.SocketExc ...
- vmvare ESXi使用
新建主机,选择系统,自定义配置,选择ios镜像,完成,打开电源,开启配置
- 给codeblocks的c编译选项添加c99标准
在codeblocks的settings中选择 compiler and debugger,选择compile setting 在其中有other options,在里面写上-std=c99 这样就可 ...