https://www.acmicpc.net/blog/view/128 나중에 읽어봐야지
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
...
이 함수는 C++ 표준 스트림과 C 표준 스트림이 각각의 입출력 연산 후에 동기화를 할지의 여부를 설정합니다.
표준 C++ 스트림: std::cin, std::cout, std::cerr, std::clog,
std::wcin, std::wcout, std::scerr, std::wclog
표준 C 스트림: stdin, stdout, stderr
default로는 8개의 표준 C++ 스트림은 대응되는 C 스트림과 동기화되어있습니다.
어떤 int c에 대해 어떤 C++ 표준 스트림 str이 C 스트림 f와 동기화되어있다는 것은 다음 함수가 동일하게 동작한다는 의미입니다.
fputc, fgetc, ungetc는 헤더 의 함수입니다.
ios::rdbuf()는 연관된 스트림 버퍼를 리턴합니다.
내부적으로 c는 쓰기 직전에 unsigned char 로 변환됩니다.
이 말은 동기화된 C++ 스트림의 입출력 연산들이 C++ 스트림 버퍼를 사용하지 않고, 대응되는 C 스트림 버퍼를 직접 사용한다는 의미입니다. 따라서 동기화 하였다면, C / C++ 입출력 연산을 혼합해 사용해도 순서가 보장됩니다. 동기화된 상태에서는 C++ 스트림 간 thread safe가 보장됩니다. 즉 여러 쓰레드에서 각각 출력 연산을 수행할 수 있고, race condition이 발생하지 않는 것입니다.
동기화를 끄면 표준 C++ 스트림들은 각각의 입출력 연산에 대해 버퍼를 사용할 수 있게 되어 입출력 연산 속도를 크게 향상할 수 있습니다. 또한 thread safe하지 않아 쓰레드의 실행 순서를 보장할 수 없습니다. 알고리즘을 풀 때는 대부분 싱글 스레드 환경이므로 상관없습니다.
동기화를 껐을 때 C / C++ 입출력 연산을 같이 사용한다면, 입출력 순서가 보장되지 않습니다.
따라서 cin과 scanf, gets, getchar를 같이 사용하면 안되고,
cout과 printf, puts, putchar를 같이 사용하면 안됩니다.
ostream* tie() const;
default로는 표준 객체인 cin, cerr, clog가 cout에 엮여 있으며,
wide character 버전인 wcin, wcerr, wclog는 wcout에 엮여 있습니다.
cin과 cout의 엮임을 풀어줍니다.(untie)
엮여있을 때는 cin이 읽기 전에 한 번 출력 버퍼를 비웁니다.
cout << "이름을 입력하세요: ";
cin >> name;
풀었을 때는 이런 상황에서 출력 버퍼가 자동으로 비워지지 않아 cout으로 출력하기 전에 먼저 cin으로 입력을 받는 것을 볼 수 있습니다. 이렇게 순서가 뒤바뀌는 것을 막고싶다면 매번 수동적으로 cout 버퍼를 flush 해줘야 합니다.
백준에서는 화면 출력 상태는 중요하지 않으므로 이를 풀어줍니다.
std::basic_ostream<CharT, Traits>* tie() const
두 개의 출력 스트림을 연결하여 한 스트림의 출력이 다른 스트림과 함께 이루어질 때 자동으로 버퍼를 비우도록 설정하거나, 두 출력 스트림이 이미 결합되어 있는지 확인하기 위해 사용됩니다.
출력 스트림 객체를 결합하여, 예를 들어 std::cout.tie(&std::cerr)와 같이, std::cerr와 std::cout을 결합할 수 있습니다. 이렇게 하면 std::cerr으로 오류 메시지를 출력하려고 시도할 때 std::cout으로 출력된 내용이 자동으로 플러시(버퍼 비우기)되어 보다 일관된 출력이 가능합니다.
출력 스트림의 결합 여부를 확인하는 데 사용될 수 있습니다. 반환 값이 nullptr이면 현재 스트림은 다른 스트림과 결합되어 있지 않음을 나타내며, 다른 스트림과 결합되어 있으면 해당 다른 스트림의 포인터를 반환합니다.
CharT:
CharT는 문자 데이터의 유형을 나타냅니다. 이것은 주로 문자 데이터 형식(예: char, wchar_t, char16_t, char32_t) 중 하나를 나타내며, 출력 및 입력 스트림이 어떤 종류의 문자를 처리할 것인지를 결정합니다. 예를 들어, std::basic_ostream는 char 형식의 문자를 처리하는 출력 스트림을 나타냅니다.
Traits:
Traits는 문자 처리 특성을 정의하는 템플릿 매개변수입니다. 이것은 문자 형식(CharT)에 대한 문자 처리 동작(예: 문자 복사, 문자 비교, 문자 변환)을 제어합니다. C++ 라이브러리는 std::char_traits와 같은 표준 문자 처리 특성 클래스를 제공하며, 이 클래스를 상속받아 특정 문자 유형에 대한 특성을 재정의할 수 있습니다.
아무 의미 없습니다.
줄바꿈과 동시에 flush하므로 속도가 느려집니다.