1. 입출력 속도 향상
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
int s, i;
cin >> s;
vector<int> v(n);
for(i=0; i<n; i++) {
cin >> v[n];
}
for(i=0; i<n; i++) {
cout << v[n] << endl;
}
return 0;
}
위 코드에서 7번째 줄에 해당하는 ios_base::sync_with_stdio(false); 를 주목해야 한다. 입력과 출력을 할 때에는 버퍼를 사용하는데 ios_base::sync_with_stdio(false);를 사용하지 않는다면 동기화 되어 있다고 표현을 하는데 이는 C++ 표준 스트림과 C 표준 스트림을 병행해서 쓸 수 있다는 것을 말한다. 이렇게 병행해서 사용하면 속도가 느려지게 된다.
따라서, ios_base::sync_with_stdio(false); 이 문장은 동기화를 하지 않겠다고 선언하는 것이며 이는 C++ 표준 스트리만 사용하겠다는 것이 된다. 따라서, 위 문장이 선언된 프로그램은 독립된 버퍼만을 사용하므로 속도적 측면에서 개선될 수 있다.
속도 비교를 해보면 다음과 같다. 이는 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일을 입력받는데 걸리는 시간을 측정한 것이다.
2. 만능 헤더 파일
//#include <iostream>
//#include <vector>
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
int s, i;
cin >> s;
vector<int> v(n);
for(i=0; i<n; i++) {
cin >> v[n];
}
for(i=0; i<n; i++) {
cout << v[n] << endl;
}
return 0;
}
매번 프로그래밍을 할 때 필요한 헤더를 선언하는 것은 불편한 일이다. 하지만, 위의 코드 처럼 bits/stdc++.h 헤더를 하나만 선언하고 cin, cout 같은 입출력 객체와 vector 컨테이너를 맘대로 쓸 수있는 방법이 존재했다.
bits/stdc++.h 헤더란 표준 라이브러리를 모두 포함하고 있는 헤더이다. 하지만 이 헤더는 GCC 전용 라이브러리이므로 GCC를 지원하는 대회 환경에서 사용해야 한다. 다행히도 대부분의 프로그래밍 환경에서는 이를 지원한다.
이렇게 편리하데 단점은 없을까? 결론부터 말하자면 단점이 존재한다. 먼저 이 헤더는 위에서 언급한 것처럼 GCC가 아닌 다른 컴파일러로 코드를 컴파일 할 경우에는 실패한다. 또한, 불필요한 헤더를 많이 포함하므로 컴파일 하는데 시간이 길어진다. 마지막으로는 이식성이 떨어진다. 이식성이란 특정 환경에서 동작하는 SW 프로그램이 다른 환경으로 변경해도 동작할 수 있는 성질을 말한다.
Dev C++에서도 바로 사용할 수는 없고 컴파일러 설정을 해야한다. 맨 위에서 [도구] - [컴파일러 설정]을 누르고 빨간색으로 표시된 부분에 -std=c++11을 추가한다.
[참고]
'알고리즘 & 자료구조 > C, C++ 공부' 카테고리의 다른 글
5. STL - 해시(map vs hash_map) (0) | 2020.09.24 |
---|---|
3. STL - 벡터(Vector) (0) | 2020.09.07 |
2. 동적 배열 할당하기(malloc) (0) | 2020.09.06 |
1. char형 데이터 int형으로 바꾸기 & char 배열 활용 (0) | 2020.09.02 |