c++ string class 구현

2023. 8. 22. 15:35c,c++/c++ 관련 개념 및 문법

알아야 할 것

*this 사용 이유

하나의 클래스에서 생성된 인스턴스는 각자 고유의 주소를 가진 메모리 공간을 갖지만, 멤버함수는 모든 인스턴스가 공유한다. 멤버 함수는 자신을 호출한 객체를 인수를 통해 전달 받아야 한다. 그 때 전달해주는 것이 자신의 포인터 *this이다.

들어갈 함수

문자열을 추가해주는 insert 함수

문자열을 삭제하는 erase 함수

문자열에서 어떤 문자를 찾는 find함수

새로운 문자를 넣고 할당하는 assign함수

insert 함수

/*  add after loc index*/
Mystring& Mystring:: insert(int loc, Mystring& str)
{
    if(loc < 0 || loc >= this->stringlen)
    {
        cout << "Error : out of str range";
        return *this;
    }
    char* previous_str = this->my_string;
    this->my_string = new char[this->stringlen+str.stringlen];
    int i;
    for(i = 0; i <= loc; i++)
    {
        my_string[i] = previous_str[i];
    }
    for(int j = 0; j < str.stringlen; j++)
    {
        my_string[i+j] = str.my_string[j];
    }
    for(; i < this->stringlen; i++)
    {
        my_string[i+str.stringlen] = previous_str[i];
    }

    this->stringlen += str.stringlen;
    delete[] previous_str;

    return *this;
}

erase 함수

/*  erase num chars including start index char*/
Mystring& Mystring:: erase(const int start, const int num)
{
    if(start < 0 || this->stringlen < start){
        cout <<"error : out of range" << endl;
        return *this;
    }
    if(start + num > this->stringlen)
    {
        cout << "error : out of range" << endl;
        return *this;
    }
    for(int i = start+num; i < this->stringlen; i++)
    {
        this->my_string[i-num] = this->my_string[i];
    }
    this->stringlen -= num;
    return *this;
}

assign 함수

Mystring& Mystring::assign(const char* str)
{
    /*  if str's length is longer than class strlength
        have to reassign dynamic assign*/
    int strlength = strlen(str);
    if(stringlen > this->stringlen)
    {
        delete[] my_string;
        my_string = new char[strlength];
    }
    this->stringlen = stringlen;

    for(int i = 0; i < strlength; i++)
    {
        this->my_string[i] = str[i];
    }
    return *this;
}

Mystring 생성자, 소멸자

/*  constructor
    put str, strlength into the class*/
Mystring::Mystring(const char* str)
{
    stringlen = strlen(str);
    my_string = new char[stringlen];
    for(int i = 0; i < stringlen; i++)
    {
        my_string[i] = str[i];
    }
}
Mystring::Mystring(const Mystring& str)
{
    stringlen = str.stringlen;
    my_string = new char[stringlen];
    for(int i =0 ; i < stringlen; i++)
    {
        my_string[i] = str.my_string[i];
    }
}
Mystring::~Mystring()
{
    delete[] my_string;
}
int Mystring::length(const char* str) const
{
    return stringlen;
}

find 함수

int Mystring::find(const char* str)
{
    // 유한 오토마타 상태 초기화
    int state = 0;
    int i = 0;

    while (i < stringlen)
    {
        if (my_string[i] == str[state])
        {
            state++;
            if (str[state] == '\0')
            {
                return i - strlen(str) + 1;
            }
        }
        else
        {
            if (state != 0)
            {
                i -= state;
                state = 0;
            }
        }
        i++;
    }
    return -1;
}

finite automata를 이용하여 구현

'c,c++ > c++ 관련 개념 및 문법' 카테고리의 다른 글

c++ stream 상태  (0) 2023.08.28
inline 함수  (0) 2023.08.24
C++ 문자열 parsing  (0) 2023.08.22
복사 생성자와 소멸자  (0) 2023.07.15
explicit 키워드, mutable 키워드  (0) 2023.07.11