C++ 模拟String类 相关

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cassert>
using namespace std;
//string 编写
/*版本1 以前的版本*/
/***************
class String
{
public:
//错误 String(char *str = NULL)
String(char *str = "")
:_str(new char[strlen(str) + 1])
{
}
String(const String& str)
{
_str = new char[strlen(str._str) + 1];
strcpy(_str, str._str);
}
String& operator=(const String& str)
{
if(this != &str)//防止出错 不光是效率
{
delete[] _str;//防止内存泄漏
_str = new char[strlen(str._str) + 1];
strcpy(_str, str._str);
}
return *this;
}
~String()
{
if(_str != NULL)
{
delete[] _str;
_str = NULL;
}
}
private:
char* _str;
};
**************/
//##########################################
#if 0
/*版本2 string()*/
class String
{
public:
String(char *str = "")
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
String(const String& str)
:_str(NULL)
{
String tmp(str._str);
swap(_str, tmp._str);
}
~String()
{
if(_str != NULL)
delete[] _str;
}
String& operator=(const String &str)
{
if(this != &str)
{
String tmp(str);
swap(_str, tmp._str);
}
return *this;
}
public:
bool operator==(String &s)
{
assert(_str);
assert(s._str);
while(*(_str) == *(s._str))
{
if(_str == ‘\0‘)
return true;
_str++;
s._str++;
}
return false;
}
bool operator>(String &s)
{
assert(_str);
assert(s._str);
while(*(_str) == *(s._str))
{
if(_str == ‘\0‘)
return false;
_str++;
s._str++;
}
return (*_str - *(s._str) > 0 ?true :false);
}
bool operator<(String &s)
{
return !(*this > s || *this == s);
}
public:
/* 自己的 不是很好 */
/********************************
void insert(int pos, char ch)
{
char* str = _str;
int len = strlen(str) + 2;
char* new_p = new char[len];
char* p = new_p;
int i = 0;
for(i = 0; i < pos - 1; i++)
{
*p = *(str);
p++;
str++;
}
*p++ = ch;
for(i = pos; i < len; i++)
{
if(*str == ‘\0‘)
{
break;
}
*p = *(str);
p++;
str++;
}
swap(_str, new_p);
delete[] new_p;
}
************************************/
public:
void insert(int pos, char ch)
{}
private:
char *_str;
};
#endif
//##########################################
/********************************
* 简单实现String类 部分函数
* String& operator=(String str)
* String& operator>(String str)
* String& operator<(String str)
* void insert(int pos, char* str)
* void insert(int pos, const String& str)
* void PushBack(int ch)
* void insert(int pos, char ch)
********************************/
class String
{
#define MORE_CAPACITY 10
public:
String(char* str = "")
:_str(new char[strlen(str) + MORE_CAPACITY])
,_len(strlen(str))
,_capacity(strlen(str) + MORE_CAPACITY)
{
strcpy(_str, str);
}
String(const String& str)
:_str(NULL)
,_len(str._len)
,_capacity(str._capacity)
{
String tmp(str._str);
swap(_str, tmp._str);
}
String& operator=(String str)
{
_len = str._len;
_capacity = str._capacity;
swap(_str, str._str);
return *this;
}
~String()
{
if(_str != NULL)
{
delete[] _str;
_str = NULL;
}
}
public:
bool operator==(const String& str)
{
if(0 == my_strcmp(str._str))
{
return true;
}
else
{
return false;
}
}
bool operator>(const String& str)
{
if(my_strcmp(str._str) > 0)
{
return true;
}
else
{
return false;
}
}
bool operator<(const String& str)
{
if(my_strcmp(str._str) < 0)
{
return true;
}
else
{
return false;
}
}
public:
void insert(int pos, char ch)
{
check_capacity(2);//2包含‘\0‘
int len = _len;
if(pos >=0 && pos <= _len)
{
while(len >= pos)
{
_str[len + 1] = _str[len];
len--;
}
_str[pos] = ch;
if(pos == _len)
{
_str[_len + 1] = ‘\0‘;
}
_len++;
}
}
void insert(int pos, char* str)
{
assert(str);
int insert_len = strlen(str);
check_capacity(insert_len + 1);//1是‘\0‘的空间
int len = _len;
if(pos >=0 && pos <= _len)//pos = _len 是‘\0‘d的位置
{
while(len >= pos)
{
_str[len + insert_len] = _str[len];
len--;
}
//strcpy(&_str[pos], str);//error:会加入‘\0‘
int i = 0;
for(i = 0; i < insert_len; i++ )
{
_str[i + pos] = str[i];
}
_str[_len + insert_len] = ‘\0‘;
_len += insert_len;
}
}
void insert(int pos, const String& str)
{
insert(pos, str._str);//类中定义方法 可以访问同类对象的私有成员
}
void PushBack(int ch)
{
check_capacity(sizeof(int) + 1);
_str[_len] = (char)ch;
_str[_len + 1] = ‘\0‘;
_len++;
}
private:
int my_strcmp(const char* str2)
{
assert(_str);
assert(str2);
char* str1 = _str;
while(*str1 == *str2)
{
if(‘\0‘ == *str1)
{
return 0;
}
str1++;
str2++;
}
return (*str1 > *str2 ? 1 : -1);
}
private:
void check_capacity(int length)//还需要的长度length 包含\0
{
if(_capacity - _len < length)
{
if(_str != NULL)
{
int new_capacity = length + _len + MORE_CAPACITY;
char* new_str = new char[new_capacity];
strcpy(new_str, _str); 
delete[] _str;
_str = new_str;
_capacity = new_capacity;
}
}
}
private:
char* _str;
int _capacity;//容量
int _len;//长度
};
void test1()//测试 String的构造 复制 赋值函数
{
String str1;
String str2("str2");
String str3(str2);
str1 = str3;
}
void test2()//测试 operator== operator< 以及operaator>
{
String str1("str1"),str2("str2   "),str3(str1);
cout<<(str1 > str2)<<endl;//false
cout<<(str1 < str2)<<endl;//true
cout<<(str1 == str3)<<endl;//true
cout<<(str1 == str2)<<endl;//false
}
void test3()//测试void insert(int pos, char ch)
{
String str1("abcdef"),str2(str1),str3(str1),str4(str1);
str1.insert(0,‘M‘);
str2.insert(6,‘M‘);
str3.insert(2,‘M‘);
str4.insert(-1,‘M‘);
str4.insert(10,‘M‘);
}
void test4()//测试void insert(int pos, char* str) 
{
String str1("abcdef"),str2(str1),str3(str1),str4(str1);
str1.insert(0,"ABCDEF");
str2.insert(6,"ABCDEF");
str3.insert(2,"ABCDEF");
str4.insert(-1,"ABCDEF");
str4.insert(10,"ABCDEF");
}
void test5()
//测试void insert(int pos, const String& str)
//测试 void PushBack(int ch)
{
String str1("abc"),str2("ABC");
str1.insert(0, str2);
str2.PushBack(‘D‘);
}
int main()
{
test5();
getchar();
return 0;
}
时间: 2024-12-07 13:05:31

C++ 模拟String类 相关的相关文章

Java String类相关知识梳理(含字符串常量池(String Pool)知识)

目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(String Pool) 4. String类所用的连接符 5. String类的主要作用(简) 正文 1. String类是什么 1.1 定义 String类表示字符串.Java程序中的所有字符串都是这个String的实例,比如"abc".字符串为常数,它们的值在创建之后不能更改.因为字符

C++ 中string类的三种模拟实现方式

1.原始版本(拷贝构造和赋值运算符重载时,需要重新开辟空间) #include <iostream> #include <string> using namespace std; class String { friend ostream& operator<<(ostream& os, const String& S); public: String(char* str = "") :_str(new char[strlen

String类的一些内部实现方法

今天看了一下String类的一些基本用法,以后的时间需要不断巩固自己对java基础的理解,所以写下来让自己可以不断的反复复习. 下面把这些简单的代码实现粘贴下来. import java.lang.String; public class StringDemos{ /** 答案一:1.模拟String类中trim方法 思路: 1.将字符串转换成字符数组 2.定义start 和 end 变量 3.判断收尾是否有空格,首有则start++,尾有则end--,保证start<end 4.可以用到sub

c++string类的相关操作

string的应用是非常典型的,下面我写了一些简单的string类的相关的一些操作,包括增删查改等一些功能和一些运算符的重载,包括他们的测试用例: #include<iostream>#include<string>#include<assert.h>using namespace std; #define CARA 3;class String{public: String(char *str = "")  :_str(new char[strle

运用String类实现一个模拟用户登录程序

package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密码是否一致:一致则输入成功,否则重新输入 // 3.输入错误时,提示剩余输入次数,最多三次 public class Test { public static void main (String [] args){ String useName="wang"; String goToCar

Java基础篇(02):特殊的String类,和相关扩展API

本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类是不可以继承扩展和修改它的方法.String类用处极广泛,在对String对象进行初始化时,和基本类型的包装器类型一样,可以不使用new关键字构造对象.(是真的妖娆...) 2.类构造和方法 String类结构 特点:final关键字修饰,实现Serializable序列化接口,Comparable

整理了一下string类,math类的相关基础知识;

string 类: 一:计算字符的长度:a=a.length; 二:去字符的空格:1.a=a.trim();{去除字符的前后空格} 2.a=a.trimstart();{去除字符前面空格} 3.a=a.trimend();{去除字符后面空格} 三:字符的大小写转换:1.a=a.ToLower();{大写转换小写} 2.a=a.Upper();{小写转换大写} 四:计算/索引:1.a=a.indexof("o");{第一次出现“o”是第几个字符} 2.a=a.lastindexof(&q

(1)String类 (2)StringBuilder类和StringBuffer类 (3)日期相关的类

1.String类(重中之重)1.1 常用的方法(练熟.记住)(1)常用的构造方法 String() - 使用无参的方式构造空字符串对象. String(byte[] bytes) - 根据参数指定的byte数组来构造对象. String(byte[] bytes, int offset, int length) - 使用bytes数组中从offset位置开始的length个字节来构造对象. String(char[] value) - 根据参数指定的char数组来构造对象. String(ch

黑马程序员——Java基础---String类

--Java培训.Android培训.iOS培训.UI培训.PHP培训.期待与您交流! -- Scanner的概述和方法介绍 1.Scanner类的构造方法 Scanner(InputStream source) 2. 一般方法 hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等.如果需要判断是否包含下一个字符串,则可以省略Xxx package com.geekds.scanner; import java.util.Scanner; public cl