[알고리즘/C++] split()함수 구현하기

    목차

C++ STL에서는 split() 함수를 지원하지 않는다고 한다.

그래서 직접 작성해서 구현해야 한다.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<string> split(string input, string delimiter) {
    vector<string> ret;
    long long pos = 0;
    string token = "";
    while ((pos = input.find(delimiter)) != string::npos) {
        token = input.substr(0, pos);
        ret.push_back(token);
        input.erase(0, pos + delimiter.length());
    }
    ret.push_back(input);
    return ret;
}
int main() {
    string s = "안녕하세요. 적당히 바람이 시원해 기분이 너무 좋아요 유후. 끝내줬어요. 긴장한 탓에 엉뚱한 얘기만 늘어놓았죠. 바보같이.", d = " ";
    vector<string> a = split(s, d);
    for (string b : a) cout << b << "\n";

    return 0;
}

 

선언하는 문장들을 빼면 대부분 핵심내용은 While문에 들어있다.

 

우선 While의 조건부를 살펴보자.

While((pos = input.find(delimiter)) != string::npos)

pos는 long long 형의 수이고, pos에 input이라는 스트링에서 delimiter라는 스트링이 위치한 인덱스를 삽입한다.

그런데 그것이 string::npos와 다르다면 반복문이 계속해서 실행된다.

 

string::npos는 find 함수에서 해당 문자열을 찾이 못하였을 때 반환된다.

 

(참고로, string::npos 는 size_t 타입의 최대값을 의미한다.

size_t의 최대값은 OS에 따라 달라진다.

64비트 운영체제는 64비트 부호가 없는 최대 정수,

32비트 운영체제는 32비트 부호가 없는 최대 정수.)

 

즉, 위 반복문은 해당 문자열을 찾지 못할때 까지 계속 반복하라는 뜻이다.

예를들어, 공백 문자열이 delimiter라고 하면, 공백을 찾지 못할때 까지 계속 반복하라는 뜻이다.

 

 

실행부를 살펴보자.

token = input.substr(0, pos);
ret.push_back(token);
input.erase(0, pos + delimiter.length());

 

1.

빈문자열로 초기화한 token에 input의 일부분을 대입한다.

pos는 delimiter의 인덱스였다.

즉, delimiter전 까지의 문자열을 대입한다.

예를들어, "abcd" 에서 delimiter가 "d"였다면, token에는 "abc"가 대입된다.

 

2.

vector로 선언한 ret에 방금 대입한 token을 삽입한다.

 

3.

input 문자열의 처음에서 방금 ret에 삽입한 부분 + delimiter까지 지워준다.

delimiter가 "..." 같이 길이가 1이 아닐 수도 있으니 length함수를 상용한다.