빠른 입출력 코드
// 1
#include <iostream>
using namespace std; // 2
int main() {
ios_base::sync_with_stdio(false); // 3 (중요)
cin.tie(nullptr); // 4 (중요)
int a, b;
cin >> a >> b;
cout << a+b << "\n"; // 5 (중요)
return 0;
}
// 입력: 3 4
// 출력: 7
1. #include <iostream>
C++에서 #을 사용하는 키워드를 전처리기 지시문(Preprocessor Directives)이라고 합니다.
전처리기 지시문은 컴파일 되기 전에 수행할 작업들을 정의합니다.
#include는 파이썬의 import와 같은 역할을 합니다.
그리고 파이썬에서 import의 대상을 모듈이라고 했던 것과 비슷하게, C++에서는 #include의 대상을 헤더파일이라고 합니다.
iostream은 C++의 표준 입출력 클래스입니다.
C에서 입출력을 stdio의 함수(printf(), scanf())를 통해 했다면, C++은 객체를 통해 합니다.
물론 C처럼 printf(), scanf()를 사용할 수도 있습니다.
2. using namespace std;
이후에 나올 cin과 cout은 C++ 표준 입출력 객체로, std라는 namespace에 포함되어있는 객체입니다.
따라서 cin과 cout을 사용하려면 범위 지정 연산자(::)를 사용하여 std::cin과 std::cout으로 사용합니다.
하지만 using 지시문을 사용하면 컴파일 도중 이름을 찾지 못했을 경우 지정된 namespace에서 찾게 됩니다.
따라서 cin과 cout만 사용해도 std에서 cin과 cout을 찾아 정상적으로 동작합니다.
3. ios_base::sync_with_stdio(false);
ios_base라는 namespace에 있는 sync_with_stdio 함수는 C의 stdio와 C++의 iostream을 동기화할지 여부를 설정합니다.
기본값은 true로 동기화가 활성화되어 있습니다.
따라서 iosteam의 cin과 cout의 속도가 느립니다.
이를 false로 동기화를 비활성화할 수 있고, cin과 cout의 성능이 향상됩니다.
대신 iostream의 입출력과 stdio의 입출력을 같이 사용하면 엉뚱한 결과가 나올 수 있어서, 같이 사용하면 안됩니다.
4. cin.tie(nullptr);
std::cin과 std::cout은 기본적으로 묶여 있습니다.
묶여있는 std::cin에서 입력을 받을 때, 자동으로 std::cout의 버퍼를 비웁니다.(화면에 출력됩니다.)
이는 입력을 받기 전에 화면에 출력을 즉시 보여주어 사용자의 혼란을 막습니다.
그런데 PS에서는 입력을 받을 때 버퍼를 비울 필요가 없고, 입력마다 버퍼를 비우는 과정이 비효율적이므로 묶음을 풀어냄으로써 빠른 입출력이 가능합니다.
5. \n
개행문자로 C++에서 std::endl이 있습니다.
std::endl은 개행을 수행하면서 동시에 버퍼를 비웁니다.(화면에 출력됩니다.)
역시 PS에서는 개행문자가 들어갈 때 바로바로 출력할 필요가 없으므로 std::endl은 비효율적입니다.
따라서 개행문자로 "\n"을 사용하면 입출력 속도가 빨라집니다.