본문 바로가기

C++ and STL

[C++] endl을 쓰지말자

알고리즘 문제를 풀다보면 아주 많은 수의 입력을 받아야 하는 경우가 종종 있다.

일반적으로 C++에서 입력은 cin을 통해서 받고, 출력은 cout을 통해 하게 된다.

출력을 하게 되면 출력 문 끝에 개행을 해야 하는 경우가 대부분이다.

이경우 endl을 쓰게 되는데, endl의 역할은 개행문자("\n")를 출력할 뿐아니라

출력 버퍼를 비우는 일까지 수행한다. 그런데 버퍼를 비우는 작업이 매우 느린 작업이다.

따라서, endl을 사용해서 버퍼를 비우는 작업까지 수행할 필요는 없다.

이 작업만 하지 않아도 충분히 속도가 빨라진다.

 

입력을 받은 cin의 경우에도 입력 전에 출력 버퍼를 비우는 작업을 한다.

그리고 cin과 cout은 묶여있다. 따라서, 이 묶음을 풀어줄 필요가 있다. 아래 구문을 사용하면 된다.

 

cin.tie(NULL);

 

추가로 고려해야 할 것은 C++의 iostream을 C와 동기화 시켜주는 역할을 하는 sync_with_stdio이다

이게 true일 경우 iostream과 stdio 헤더의 버퍼를 모두 사용하기 때문에 약간의 딜레이가 발생하게 된다.

이 옵션도 끄자. 그러면 C++은 자신만의 독립적인 버퍼만 사용하게 된다.

아래 구문도 main() 함수에 추가하자.

 

ios::sync_with_stdio(false);

 

정리하면,

1. main()함수에 cin.tie(NULL); 과 ios::sync_with_stdio(false); 를 항상추가하자.

2. 개행은 endl;을 사용하지 말고 "\n"; 을 사용하자

 

아래는 PS용 기본 템플릿이다.

 

#include <iostream>

using namespace std;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	/* your code here */
	return 0;
}

'C++ and STL' 카테고리의 다른 글

[STL] 컨테이너 정렬상태 확인 is_sorted()  (0) 2022.03.06
segmentation fault를 조심하자  (0) 2022.03.06