实现简单的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: ...
随机推荐
- redux沉思录:基于flux、状态管理、函数式编程的前端状态管理框架
基于flux和reduce的通信和状态管理机制; 和数据库管理系统一样,redux是一个状态管理系统(或机制). const store = createStore( reducer, compose ...
- 大文件上传控件webupload插件
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- nightwatch 基于Webdriver的端到端自动化测试框架
nightwatch 是使用nodejs编写的,基于Webdriver api 的端到端自动化测试框架 包含以下特性 清晰的语法,基于js 以及css 还有xpath 的选择器 内置测试runner, ...
- A1016 | 磨人的大模拟
这题写得头晕……明天我再评价 #include <stdio.h> #include <memory.h> #include <math.h> #include & ...
- 洛谷P2580 于是他错误的点名开始了 题解
qwq!为什么!木有非结构体非指针的题解怎么阔以!所以, 我来辽~咻咻咻~ 题面 来分析, 我们可以先建一棵树,来存储整个名单, 然后再判断 ; i <= n; i++) { root = ; ...
- 【数论】[因数个数]P4167樱花
题目描述 求不定方程 \(\frac {1}{x} + \frac{1}{y} = \frac{1}{n!}\)的正整数解的个数 \(n \leq 100^6\) Solution 化简得 \(x * ...
- HTML引入外部JS文件
<!--引入外部文件的方式--> <script type="text/javascript" src="attack.js">< ...
- shell 小数比较大小
a=1.6b=6.1c=`echo "$a > $b" | bc`然後,如果 $c 是 1 ,那就成立,否則不成立. 参考: http://ju.outofmemory.cn ...
- 获取Android包名和activity名
个人主要用2个方法. 方法1:pm list package 方法2: windows:adb shell logcat | findstr START; linux: adb shell logca ...
- 设计模式 桥梁模式 JDBC
桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation) ...