c++ string class 구현
2023. 8. 22. 15:35ㆍc,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 |