c++ string的实现。

c++ string的实现

做完textquery,再做string。感觉简单太多了。

1)最基本 string功能实现了。 [],=,+.

2) 基本是熟悉指针的值copy的场景。

3)看了下网上一些例子,不少都没有 str_capition 这个字段。默认构造函数的大小只有1个字节。就算是例子,感觉也不能这样写,自己的例子是 默认32字节,一个cpu字长吧。也 不知道是我理解问题,还是网上一些例子确实不合适。

#include <iostream>
#include "malloc.h"
#include "typeinfo"

using namespace std;

unsigned int GetCharSize(const char* _p);
char * Get_p_Copyvalue(const char* _p);
void p2p_Copyvalue(const char * const sp,char* const dp);

class MyString
{
public:
    MyString();
    MyString(const char * _p);
    MyString(const MyString& _mys);
    //effect建议=copy返回引用。自己理解主要是省去临时对象的创建和西构。因为这个和普通函数不一样。已经有隐藏参数this。
    //根本没有必要一定要返回对象。1)this已经更新了数据。不需要返回对象去副职。2)返回指针可以给连式=,的下一个表达式传入指针(哦,不是,这里就算返回对象下一次还是传入指针)
    MyString& operator=(const MyString& _mys);
    //这里有修改char需要。所以必须返回引用或指针。而对象一定存在的情况,必须抛弃指针,而使用引用。
    char& operator[](const unsigned int index);
    //这里就感觉不能返回引用。=copy,传入了this,返回的对象是this。而+号虽然也传入this。但是返回的临时对象。+号不可能去修改this。
    //那么必须返回对象,给临时对象,以便正确副职给临时变量。
    MyString operator+(const MyString& _mys);

    ~MyString();

    unsigned int getCap();

friend ostream& operator<<(ostream& os,const MyString& ms);
private:
    unsigned int str_capition;
    char * char_p;

};
unsigned int MyString::getCap()
{
    return str_capition;
}
MyString::MyString()
{
    this->char_p=(char *)malloc(32);
    this->char_p[0]=‘\0‘;
    this->str_capition=32;
}

MyString::MyString(const char* _p)
{
    if(_p==0x0)
    {
        this->char_p=(char *)malloc(32);
        this->char_p[0]=‘\0‘;
        this->str_capition=32;
    }
    else
    {
        unsigned int charSize=GetCharSize(_p);
        str_capition=charSize+1;
        char_p=Get_p_Copyvalue(_p);
    }
}

MyString::MyString(const MyString& _mys)
{
    //为什么private,而_mys.str_capition是合法的?
    str_capition=_mys.str_capition;
    char_p=Get_p_Copyvalue(_mys.char_p);
}

MyString& MyString::operator=(const MyString& _mys)
{
    unsigned int charSize=GetCharSize(_mys.char_p);
    if(this->str_capition>=charSize+1)
    {
        p2p_Copyvalue(_mys.char_p,this->char_p);
    }
    else
    {
        char * oldp=this->char_p;

        this->str_capition=_mys.str_capition;
        this->char_p=Get_p_Copyvalue(_mys.char_p);

        delete oldp;
    }
    return *this;
}

char& MyString::operator[](const unsigned int index)
{
    unsigned int charSize=GetCharSize(this->char_p);
    if(index<=charSize-1&&index>=0)
    {
        return this->char_p[index];
    }
    else
    {
        //刚开始不知如何处理,刚催返回mystring结束标志‘\0‘的地址。挺好。
        return this->char_p[charSize];
    }
}

MyString MyString::operator+(const MyString& _mys)
{
    unsigned int  lhsLen=GetCharSize(this->char_p);
    unsigned int  rhsLen=GetCharSize(_mys.char_p);
    unsigned int strCap=lhsLen+rhsLen+1;

    char * p=(char *)malloc(strCap);

    for(unsigned int i=0;i!=lhsLen;++i)
    {
        p[i]=this->char_p[i];
    }
    for(unsigned int i=0;i!=rhsLen;++i)
    {
        p[i+lhsLen]=_mys.char_p[i];
    }

    p[strCap-1]=‘\0‘;

    MyString tmp=MyString(p);
    return tmp;
}

MyString::~MyString()
{
    delete char_p;
}

int main()
{
    MyString str1="hi!";
    MyString str2=str1;
    //虽然没有直接指针的copy函数。但是其实会执行MyString::MyString(const char* _p)和MyString& MyString::operator=(const MyString& _mys)
    //隐士执行了2个函数。
    str1="hi!pp.";
    cout<<str1<<endl;
    cout<<str2<<endl;

    MyString str3="abcdefg";
    cout<<str3<<endl;
    str3=str1;
    cout<<str3<<endl;

    MyString emptystr;
    cout<<"empty:"<<emptystr<<".cap:"<<emptystr.getCap()<<endl;
    emptystr=str3;
    cout<<"empty:"<<emptystr<<".cap:"<<emptystr.getCap()<<endl;

    str3[3]=‘x‘;
    cout<<str3<<"‘"<<str3[99]<<"‘"<<endl;

    str3=str1+str2;
    cout<<str3<<endl;

    MyString str4=str1+str2;
    cout<<str4<<endl;

    char * emptyp="aaa!";
    MyString str5=MyString(emptyp);
    cout<<str5<<endl;
    emptyp=0x0;

    MyString str6=MyString(emptyp);
    cout<<"0x0 pointer:"<<str6<<"cap:"<<str6.getCap()<<endl;

    return 0;
}

unsigned int GetCharSize(const char* _p)
{
    unsigned int i=0;
    while(_p[i]!=‘\0‘)
    {
        ++i;
    }
    return i;
}

char * Get_p_Copyvalue(const char* _p)
{
    unsigned int charSize=GetCharSize(_p);
    char *  char_p=(char *)malloc(charSize+1);
    for(unsigned int i=0;i!=charSize;++i)
    {
        char_p[i]=_p[i];
    }
    char_p[charSize]=‘\0‘;
    return char_p;
}

void p2p_Copyvalue(const char * const sp,char* const dp)
{
    unsigned int charSize=GetCharSize(sp);
    for(unsigned int i=0;i!=charSize;++i)
    {
        dp[i]=sp[i];
    }
    dp[charSize]=‘\0‘;
}

ostream& operator<<(ostream& os,const MyString& ms)
{
    return os<<ms.char_p;
}
时间: 2024-10-12 22:38:23

c++ string的实现。的相关文章

C# 引用类型之特例string

在C#编程的时候经常会使用字符串(string)类型,它也是引用类型,但是处处都不作为引用的用法来使用,实属特例,下来我一一罗列出来,供自己记忆方便: 1)字符串的直接赋值:本身字符串就是引用类型,应该使用  new 对象方法一个实例,但是微软为了方便大家,可以直接定义字符串变量 并且赋值操作,例如: string a = "我的中国心"; ,这样只是简化我们的操作: 2)一个字符串赋值给另一个字符串变量:正常的引用类型会将两个引用变量指向同一个地址,但是一个字符串变量赋值给另一个字符

C++ String 及其与char[]的比较

在学习C++之前  一般都是学过了C语言了 在C语言中   我们对字符串进行保存操作  使用的是char[] 但是在C++中    string比char[]的使用更为频繁  常见    下面稍微讲一下我对于string的认知 1.与其他的标准库类型一样   用户程序需要使用String类型对象  就必须包含相关的头文件   (为了编写方便   需要提供合适的using声明) #include <string> using std::string; 2.string对象的定义与初始化 stri

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException

"The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException" "构造函数ClassPathXmlApplicationContext(字符串)是指缺失类型BeansException" 出现错误的原因:jar没有正确引入,即使表面上你能import包. import org.junit.Test; import org.spring

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

JAVA: String详解

String 类用来存储字符串 ,是不可变的. 1. 基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2. 复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.用 str.equals(str2) 方法来比较字符串的值是否相等. 3. len

TypeError: string indices must be integers, not str

1. TypeError: string indices must be integers, not str 字符串类型取第index个字符的时候,应该传入int而不是str.如 view source print? 1 a='abcdef' 2 print a[0] 3 #而不是 print a['0'] 更常见的情况是把一个string当成了字典在使用 :should_be_dict_but_string['id'] .这样的错误

to String()用法

toString()的使用: * * 1.java.lang.Object类中toString()定义如下: * public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } * * 2. 当我们打印一个对象的引用时,实际上就是调用了其toString() * * 3. 像String.Date.File.包装类等重写了Object类中的toString

186. Reverse Words in a String II

https://leetcode.com/problems/reverse-words-in-a-string-ii/#/description Given an input string, reverse the string word by word. A word is defined as a sequence of non-space characters. The input string does not contain leading or trailing spaces and

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. 1 /** 对象克隆 2 * 支持基本数据类型及对象 3 * 递归方法 */ 4 function clone(obj) { 5 var o; 6 switch (typeof obj) { 7 case "undefined": 8 break; 9 case "string": o = obj + &q