알고리즘 문제를 풀다가 C++에서 제공하는 stringstream을 사용하여 문제를 더 간단하게 푸는 방법이 있다는 것을 깨달았다! 그래서 stringstream이 무엇인지 정리를 해보려고 한다.
C++에서는 문자열을 공백 또는 개행 문자(\n)를 기준으로 int형, string형, float형 등 다양한 자료형으로 잘라서 받을 수 있는 stringstream을 제공한다.
일단 stream이 무엇인지 한번 살펴보자.
일반적으로 컴퓨터 기술에서 스트림(stream)은 연속적인 데이터의 흐름을 의미한다.
C++은 스트림이라는 정교한 입출력 매커니즘을 제공한다. 스트림은 입력 스트림, 출력 스트림으로 나뉜다.
입력 스트림
출력 스트림
C++ 응용 프로그램에서는 입출력 장치대신 입출력 스트림으로부터 입력을 받고 출력을 한다.
C++의 표준 입력 스트림 객체는 cin이며, 표준 출력 스트림 객체는 cout이다.
스트림은 내부에 버퍼(buffer)라는 임시 메모리 공간을 가지며, 이를 이용하여 프로그램의 입출력을 효율적으로 처리한다.
버퍼를 사용하지 않는다면 키보드의 입력이 키를 누르는 즉시 프로그램에 바로 전달되게 된다.
하지만 버퍼를 사용한다면 키보드의 입력이 있을 때마다 버퍼에 입력을 전송하고, 버퍼가 가득차거나, 개행 문자가 나타나면 버퍼의 내용을 프로그램에 한번에 전송한다.
stringstream은 문자열에서 작동하는 스트림 클래스이다. 즉, 외부 입출력을 받는 것이 아니라 string type에서 입출력을 받는 것이다.
주로 문자열에서 띄어쓰기를 기준으로 다양한 타입의 데이터로 추출하고 싶을 때 유용하게 사용된다. 아래의 예제처럼 사용할 수 있다.
헤더는 <sstream> 이다.
#include <string>
#include <sstream>
using namespace std;
int main() {
string str = "123 456\n789 hello";
stringstream ss;
ss.str(str); // 초기화 -> stream에 str을 대입
int n1, n2, n3;
string s;
ss >> n1 >> n2 >> n3 >> s;
}
만약 stringstream을 재사용하려면 clear()를 실행해야 한다.
예를 들어 아래 예제 처럼 for문 안에서 같은 stream을 사용하는 경우, clear() 를 실행하지 않으면 stream으로부터 각 변수로 입력이 제대로 들어오지 않는 문제가 발생한다.
stringstream stream;
for (auto record: records) {
stream.str(record);
string time, number, status;
stream >> time >> number >> status;
stream.clear();
m[number].push_back(time);
}
https://velog.io/@jinh2352/%EC%8A%A4%ED%8A%B8%EB%A6%BCstream
https://tech-interview.tistory.com/199