-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtraining5_1_1.cpp
More file actions
181 lines (151 loc) · 4.52 KB
/
Copy pathtraining5_1_1.cpp
File metadata and controls
181 lines (151 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <string.h>
#include <iostream>
class MyString
{
char *string_content; // 문자열 데이터를 가리키는 포인터
int string_length; // 문자열 길이
int memory_capacity; // 현재 할당된 용량
public:
// 문자 하나로 생성
MyString(char c);
// 문자열로 부터 생성
MyString(const char *str);
// 복사 생성자
MyString(const MyString &str);
~MyString();
int length() const;
int capacity() const;
void reserve(int size);
void print() const;
void println() const;
char at(int i) const;
int compare(MyString &str);
bool operator==(MyString &str);
MyString& operator=(const MyString& str);
void insert(int loc, const MyString& s);
MyString operator+(const MyString &str);
char& operator[](int idx);
};
MyString::MyString(char c)
{
string_content = new char[1];
string_content[0] = c;
memory_capacity = 1;
string_length = 1;
}
MyString::MyString(const char *str)
{
string_length = strlen(str);
memory_capacity = string_length;
string_content = new char[string_length];
for (int i = 0; i != string_length; i++)
string_content[i] = str[i];
}
MyString::MyString(const MyString &str)
{
string_length = str.string_length;
string_content = new char[string_length];
for (int i = 0; i != string_length; i++)
string_content[i] = str.string_content[i];
}
MyString::~MyString() { delete[] string_content; }
int MyString::length() const { return string_length; }
void MyString::print() const
{
for (int i = 0; i != string_length; i++)
std::cout << string_content[i];
}
void MyString::println() const
{
for (int i = 0; i != string_length; i++)
std::cout << string_content[i];
std::cout << std::endl;
}
int MyString::capacity() const { return memory_capacity; }
void MyString::reserve(int size)
{
if (size > memory_capacity)
{
char *prev_string_content = string_content;
string_content = new char[size];
memory_capacity = size;
for (int i = 0; i != string_length; i++)
string_content[i] = prev_string_content[i];
delete[] prev_string_content;
}
// 만일 예약하려는 size 가 현재 capacity 보다 작다면
// 아무것도 안해도 된다.
}
char MyString::at(int i) const
{
if (i >= string_length || i < 0)
return 0;
else
return string_content[i];
}
int MyString::compare(MyString &str)
{
// (*this) - (str) 을 수행해서 그 1, 0, -1 로 그 결과를 리턴한다
// 1 은 (*this) 가 사전식으로 더 뒤에 온다는 의미. 0 은 두 문자열
// 이 같다는 의미, -1 은 (*this) 사 사전식으러 더 앞에 온다는 의미이다.
for (int i = 0; i < std::min(string_length, str.string_length); i++)
{
if (string_content[i] > str.string_content[i])
return 1;
else if (string_content[i] < str.string_content[i])
return -1;
}
// 여기 까지 했는데 끝나지 않았다면 앞 부분 까지 모두 똑같은 것이 된다.
// 만일 문자열 길이가 같다면 두 문자열은 아예 같은 문자열이 된다.
if (string_length == str.string_length)
return 0;
// 참고로 abc 와 abcd 의 크기 비교는 abcd 가 더 뒤에 오게 된다.
else if (string_length > str.string_length)
return 1;
return -1;
}
bool MyString::operator==(MyString &str)
{
return !compare(str); // str 과 같으면 compare 에서 0 을 리턴한다.
}
char& MyString::operator[](int idx)
{
return string_content[idx];
}
MyString MyString::operator+(const MyString &s){
insert(string_length,s);
MyString temp(*this);
return temp;
}
void MyString::insert(int loc, const MyString&s){
string_length=string_length+s.string_length;
reserve(string_length);
int i=loc;
int j=0;
while(j<s.string_length){
string_content[i+s.string_length] = string_content[i];
string_content[i] = s.string_content[j];
i++;
j++;
}
return;
}
MyString& MyString:: operator=(const MyString& str){
memory_capacity = str.memory_capacity;
string_length = str.string_length;
delete [] string_content;
string_content = new char[str.memory_capacity];
for (int i = 0; i < string_length; i++)
{
string_content[i]=str.string_content[i];
}
return *this;
}
int main()
{
MyString str1("a word");
MyString str2("sentence");
MyString str3("sentence");
str1=str1+str2;
str1.print();
}