세가지 반복문이 있다. 포, 와일, 두와일.
// 반복문 for
for (int i = 0; i < len; i++) {
i가 len보다 작을때까지 반복
}
// 반복문 while
while (condition) {
조건이 참인 경우 반복
if (조건이 만족하면) break;
}
// 반복문 do while
do {
일단 실행하고 조건을 검사함.
선실행 후판단.
}
while (조건)
입출력 성능 올리기
👉 cin.tie(NULL)과 ios_base::sync_with_stdio(false) 를 사용해서 입출력을 더 빠르게 처리할 수 있다.
대게 main 함수의 첫번째 줄에 작성한다.
예시)
#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int T;
cin >> T;
cout << T;
return 0;
}
속도가 왜 느린지부터 알아보자면 그동안 cin, cout만 사용했지만 C의 stdio와 C++의 iostream은 동기화 되어있어서 C++에서도 scanf, printf 사용할 수가 있다. 단 이 경우에는 iostream과 stdio의 버퍼를 모두 사용하여 딜레이가 발생한다(성능저하)
대신 두 스트림이 동기화하여 입출력에 있어 C와 C++의 IO(Input/Output)을 혼용해 쓸 경우 합리적이고, 스레드(thread)로부터 안전하다. 속도가 그만큼 느려지겠지? 그래서 sync_with_stdio(false)를 써주면 동기화를 비활성화 해서 성능을 높일 수 있다는 것임.(C++ 표준 스트림이 독립적으로 IO 버퍼링을 하게 되어 많은 양의 입출력이 있을 경우 성능이 많이 좋아진다.)
🛑 주의사항!
동기화가 비활성화된 경우,버퍼가 분리되었기 때문에 cin과 C의 scanf, gets, getchar 등을 같이 사용하면 안되고,cout와 C의 printf, puts, putchar 등과 같이 사용하면 안된다.
그럼 cin.tie(NULL)는 뭔데
원래 cin과 cout은 묶여있다. 입력 요청이 들어왔는데 그 전에 출력 작업이 있었다면 버퍼를 비워줘야 입력을 받을 수 있다는 것. 그러면 입출력을 할 때마다 버퍼를 비워야하면 시간이 오래걸리겠지. 그래서 cin.tie(NULL)를 통해서 입출력 묶음을 풀어주는 것이다. 대신 풀어주면 입출력 순서가 보장되지 않게 된다. 입력을 한번에 받고 출력을 한번에 처리하는 것을 볼 수 있는데 버퍼를 매번 지우는 것이 아니라 나중에 한번에 비운다는 것임.
endl 대신 "\n"
endl은 개행하는 기능 뿐 아니라 출력 버퍼를 비우는 역할도 있다. 이 출력 버퍼를 비우는 작업도 상당히 시간을 잡아먹기에 마지막 한 번에 출력을 비우는 것이 좋다. (물론, 버퍼가 꽉차면 알아서 비워준다)
+) endl은 출력 버퍼를 비우기 때문에 위에서 다룬 cin.tie(NULL)의 역할인 묶음을 끊어주는 효과를 볼 수 없게 한다. 그렇기 때문에 cin.tie(NULL)를 사용하면 \n을 사용해서 개행해야 됨.
EOF(end of file) - control + z로 끝냈을 때 루프 탈출하기
cin.eof(): 입력을 정해진 만큼 하는 것이 아니라 원하는 만큼 입력하고 종료하는 방법이다.
while(1){
cin >> a >> b;
if(cin.eof()) break;
else cout << a+b << endl;
}