C++에서는
int a = 5;
int a(5);
두 방법 모두 초기화에 사용된다.
stdio.h 는 cstdio,
stdlib.h 는 cstdlib,
math.h 는 cmath
이렇게 h 대신 앞에 c를 써줘서 파일을 사용할 수 있다
vector STL은 배열과 비슷한 기능을 수행한다.
C++은 배열 크기를 선언하고 그 안에서 사용해야 하지만, vector의 경우에는 가변배열로 늘였다 줄였다 하면서 사용할 수 있다.
void func1(vector <int> v){
v[10] = 7;
}
int main (void) {
vector<int> v(100); //0으로 초기화된 100칸짜리 배열 선언
func1(v);
cout << v[10];
}
이 코드의 출력값은 무엇일까?? 답은 0일까 7일까?
답은 7이다.
STL은 변수나 구조체처럼 함수에 보내질 때 복사본을 만들어서 보내기 때문에 swap 함수 같은 것을 만들어서 배열에 접근하더라도 원본에 영향을 주지 않는다.
bool cmp1 (vector<int> v1, vector<int> v2, int idx){
return v1[idx] > v2[idx];
}
그렇기 때문에 위 함수의 시간 복잡도는 O(1)이 아니라 O(N)이다.
왜냐하면 return 문에서 1번 연산을 하는 건 맞지만, vector를 받아오면서 n개의 칸을 모두 복사해와야 하기 때문에 원소를 복사하는 데 시간이 걸리는 것이 O(N)이다.
C++에서는 scanf와 cin 두 가지 방법으로 입력을 받을 수 있다. 그런데 두 방식 모두 공백 앞 자리까지만 입력을 받는다는 문제점이 있다.
int main (void){
string s;
cout << "input : "
cin >> s;
cout << "s is" << s;
}
/***결과
input : hi hello //입력이 hi hello
s is hi//hi에서 입력이 더 받아지지 않음
***/
이 문제를 해결할 수 있는 함수가 getline함수이다.
string s;
getline (cin, s);
cout << s;
이렇게 코드를 getline 함수를 이용해서 작성하면 공백이 포함된 문자열을 받을 수 있다.
그러나 타입을 C++ string만 받을 수 있다.
cin, cout을 사용할 때 주의할 점이 있다.
cin, cout은 입출력 시간초과를 막기 위해서 두 명령어를 실행시켜야 한다.
ios::sync_with_stdio(0)와 cin.tie(0)이다.
프로그램에서는 printf와 cout을 같이 써도 문제가 없도록 C++과 C스트림을 동기화 하고 있다. 그런데 만약 내가 C++스트림만 사용한다면 오히려 동기화 과정이 리소스 낭비일 수 있기 떄문에, 동기화를 끊어서 프로그램 수행 시간에서 이득을 보는 게 좋다. 따라서 이 때 ios
::sync_with_stdio(0)을 사용한다.
대신 동기화를 끊었기 때문에 cout과 printf를 섞어쓰면 순서가 뒤죽박죽이 될 수 있기 때문에 둘을 섞어 쓰면 안 된다.
입출력 버퍼의 혼란 때문이다. 입출력 과정에서 컴퓨터는 한 글자 한 글자 바로 내보내는 것이 아니라 버퍼에 쌓아놨다가 풀어주는 과정을 반복하는데, 입출력이 혼재된 코드에서 순서가 꼬이지 않게 기본적으로 cin 이전에 cout 버퍼를 비우는 것이 기본이다.

오른쪽은 버퍼가 제대로 비워지지 않았을 경우, (출력이 입력보다 늦게 나타남), 왼 쪽은 제 때 버퍼가 비워지면서 우리가 원하는 타이밍에 입출력이 이루어지는 경우.(출처: 바킹독 알고리즘 영상- 0x02강)
그런데 알고리즘을 채점할 때는 콘솔을 보는 게 아니라 출력되는 글자만 확인하기 때문에 입출력 글자 순서가 꼬여도 상관 없다. 따라서 cin 명령 수행 전에 cout 버퍼를 굳이 비워줄 필요가 없기 때문에 '굳이 안 비워도 된다'는 명령을 주는 것이 cin.tie(0)이다.
endl은 출력 중간중간 버퍼를 비워주는 친구인데 시간을 잡아먹는 이유가 되므로 알 필요가 없다고 한다! (원래 모르고 있었어서 다행이라고 해야할까...)