Split
Algorithm Theory
Split
Split
C# 같은 경우엔 string.split() 내장함수를 지원하지만, C++ 에는 제공하지 않는다.
그래서 C++ 에서 문자열을 나누기 위해선 직접 구현해야한다.
문자열을 나누기 위한 split 코드를 직접 구현해보자.
분석
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<string> split(const string &input, string delimiter)
{
vector<string> result;
auto start = 0;
auto end = input.find(delimiter);
while (end != string::npos)
{
result.push_back(input.substr(start, end - start));
start = end + delimiter.size();
end = input.find(delimiter, start);
}
result.push_back(input.substr(start));
return result;
}
코드를 하나씩 분석해본다.
반환을 하기위한 result, 문자열의 시작점인 start 와 문자열을 나누기 위한 end 를 선언한다.
end 에는 find 함수를 사용하여 문자열을 구분하기 위한 문자인 delimiter 파라미터의 인덱스를 대입한다.
이후 end 변수가 npos 될 때 까지, 문자열을 delimiter 를 기준으로 잘라내어 result 벡터에 push_back 한다.
while 문이 종료하면, 마지막에 넣지 못했던 문자열을 push_back 해준 뒤 반환한다.
find
find 의 함수 시그니처는 아래와 같다.
1
2
size_t find (const string& str, size_t pos = 0) const noexcept;
size_t find (const char* s, size_t pos = 0) const;
- 타입 :
size_t - 첫번째 파라미터 : 어떤 문자를 찾을 것인지에 대한
string - 두번째 파라미터 : 몇번째 인덱스부터 찾고싶은지, 시작지점을 나타내는
size_t- 두번째 파라미터에 인자를 넘겨주지 않을 시, 기본값인
0에서 부터 시작
- 두번째 파라미터에 인자를 넘겨주지 않을 시, 기본값인
- 반환 : 처음으로 나타난 내가 찾고싶던 문자에 대한 위치를 반환한다.
아래와 같이 사용할 수 있다.
1
2
3
4
5
// 처음으로 나타나는 delimiter 문자 반환
size_t text = input.find(delimiter);
// start 인덱스 위치를 기준으로 했을 때, 처음으로 나타나는 delimiter 문자 반환
size_t text = input.find(delimiter, start);
예로들면, apple,banana,orange,lemon 이라는 문자열이 있을 때, delimiter 의 인자를 , 로 주게 된다면,
문자열에서 처음으로 나타나는 , 의 인덱스 위치를 반환한다.
즉 apple 이후에 나타나는 , 의 인덱스 위치 5 를 반환하게 된다.
1
2
3
4
5
string str = "apple,banana,orange,grape";
string s = ",";
size_t text = str.find(s); // 5 반환
substr
substr 함수는 문자열을 자르고 싶을 때 사용하는 함수이다.
함수 시그니처는 아래와 같다.
1
string substr(size_t pos = 0, size_t len = npos) const;
- 타입 :
string - 첫번째 인자 : 자르고 싶은 시작 위치
- 두번째 인자 : 자르고 싶은 문자열의 길이
-
len을 생략하면 시작위치에서부터 끝까지 잘라낸다.
-
아래와 같이 사용할 수 있다.
1
2
3
string s = "apple,banana,orange";
string sub = s.substr(6, 6); // index 6부터 6글자 가져오기
cout << sub << endl; // "banana"
Complete Code
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
#include <bits/stdc++.h>
using namespace std;
vector<string> split(const string &input, string delimiter)
{
vector<string> result;
auto start = 0;
auto end = input.find(delimiter);
while (end != string::npos)
{
result.push_back(input.substr(start, end - start));
start = end + delimiter.size();
end = input.find(delimiter, start);
}
result.push_back(input.substr(start));
return result;
}
int main()
{
string str = "apple,banana,orange,grape";
vector<string> fruits = split(str, ",");
for (const string &fruit : fruits)
{
cout << fruit << " ";
}
return 0;
}
