cin과 cout과 관련된 입출력이 많은 경우 C++의 실행 속도를 좀더 빠르게 하는 방법이 있다.
cin.tie(NULL)과 ios_base::sync_with_stdio(false)를 적용해 주고, std::endl 대신 '\n'을 사용하는 것이다.
/* 적용 예시 */
#include <iostream>
int main(void)
{
int main()
{
std::ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);
int input;
std::cout << "input : \n";
std::cin >> input;
[...]
return (0);
}
std::ios::sync_with_stdio(true)는 stdio (C)와 iostream (C++)을 둘 다 사용하기 위해 동기화한다.
따라서 false를 적용하면 C와 C++ 사이의 버퍼 동기화를 비활성화 시켜준다. C버퍼를 안 쓰게 되므로 실행속도가 빨라진다.
cin과 cin 버퍼를 묶지 않는다는 것인데, 버퍼가 묶여있다는 것은 std::cin이 실행될 때마다 std::cout 버퍼를 비운다는 것이다.
tie(NULL)을 적용해주면 std::cin을 다 받은 뒤 버퍼가 비워지는 등 정의되지 않은 동작이 발생하게 된다. 즉, 어떤 시스템에서는 순서대로 나오고, 다른 시스템에서는 cin을 받은 뒤 cout을 출력해주는 경우가 생긴다.
따라서 수동으로 cout 버퍼를 비워줘야 한다.
하지만 std::endl 을 사용하게 되면 출력버퍼를 비우게 되므로 입력과 출력이 순서대로 이뤄진다.
코딩테스트의 경우 출력결과 값만 확인하기 때문에 입력과 출력 순서가 꼬여도 상관 없다.
std::endl의 경우 개행 문자 출력을 하면서 출력 버퍼를 비워준다. 더 빠르게 하고 싶다면 '\n'만 사용한다.
os.flush()를 호출해 출력버퍼를 비우는 방법이다. 다음과 같이 사용한다.
std::cout << std::flush
사실 ignore는 말 그대로 무시하고 들어가는 동작이기 때문에 실제 비워주는 것과는 다르다. 다만 버퍼를 비워준것 같은 효과가 있다.