STL과 함수 인자
함수 인자
첫 번째의 경우, int를 함수 인자로 보내면 값이 복사되어 넘어간다.
그러므로 함수에서 값을 바꾸더라도 main의 변수 t에는 영향이 없다.
두 번째의 경우, 함수에서 배열을 인자로 받고 있다. 배열의 주소를 넘겨주게 되는 것이므로, arr[0]의 값은 바뀌게 된다.
세 번째의 경우, 구조체는 값이 복사되기 때문에 함수에서 값을 바꾸어도 원본에 영향을 주지 않는다.
참조자
swap1 함수는 인자로 복사된 값을 받았기 때문에 의도대로 swap되지 않는다.
swap2 함수처럼 포인터를 보내거나, swap3 함수처럼 참조자(Reference)를 이용하여 해결할 수 있다.
STL(Standard Template Library) - vector
vector는 일종의 가변 배열로 크기를 마음대로 늘리거나 줄일 수 있다.
vector를 선언한 후에 일반적인 배열을 쓰듯이 인덱스에 접근하여 값을 변경할 수 있다.
STL을 함수 인자로 넘기면 복사본을 만들어서 넘기기 때문에 함수 내에서 바꾼 값은 원본에 영향을 주지 않는다.
이 함수의 시간 복잡도는 O(N)이다.
v1, v2를 인자로 보낼 때 원본으로부터 복사를 하고 있기 때문이다.
v1, v2의 크기가 N이므로, N개의 원소를 복사하는 과정의 시간 복잡도는 O(N)이다.
매번 값을 복사하지 않으려면 참조자를 이용하면 된다.
참조자를 사용하면 함수가 호출되었을 때 복사본을 만들지 않고 참조 대상의 주소 정보만 넘긴다.
그래서 시간 복잡도는 O(1)이 된다.
표준 입출력
scanf와 cin 모두 공백을 포함한 문자열을 입력 받을 때 불편하다.
getline을 사용하는 것이 깔끔해 보인다.
공백이 포함된 문자열을 받을 때 단순히 scanf와 cin을 사용하면 안 된다!
✔️ cin을 통한 다른 입력 과정이 있어 버퍼에 개행 문자가 남아있다면 cin.ignore()를 이용해서 버퍼를 비워주어야 getline 시 정상적으로 입력받는다!
cin/cout은 입출력으로 인한 시간 초과를 막기 위해 ios::sync_with_stdio(0), cin.tie(0)이라는 명령어를 실행해야 한다.
코드의 흐름과 실제 출력이 동일하도록 하기 위해서 프로그램은 기본적으로 C++ stream과 C stream을 동기화하고 있다.
그러나 C++ stream만 사용할 것이라면 굳이 두 stream을 동기화 할 필요가 없다.
동기화를 끊어 프로그램 수행 시간에서 이득을 챙길 수 있는 명령어가 ios::sync_with_stdio(0) 이다.
동기화를 끊었다면 cin/cout과 scanf/printf를 섞어 사용하면 안 된다.
온라인 저지 사이트에서는 채점을 할 때 출력 글자만 확인한다.
그렇기 때문에 콘솔 창에서 입력 글자와 출력 글자 사이에 순서가 꼬여도 채점에 영향을 주지 않는다.
그래서 cin 명령을 수행하기 전에 cout 버퍼를 비울 필요가 없다.
cin 명령을 수행하기 전에 cout 버퍼를 비우지 않도록 하는 코드가 cin.tie(0)이다.
endl은 사용하지 않는다!
endl은 개행 문자를 출력하고 출력 버퍼를 비우는 명령어이다.
프로그램 종료 시 출력만을 가지고 채점을 진행하므로 중간중간 출력 버퍼를 비울 필요가 없다.
줄 바꿈을 할 때는 endl 대신 그냥 개행 문자를 출력하자.
출처: 바킹독님 블로그
'Algorithm > Study' 카테고리의 다른 글
[바킹독의 실전 알고리즘] 0x06강 - 큐 (0) | 2023.11.05 |
---|---|
[바킹독의 실전 알고리즘] 0x05강 - 스택 (0) | 2023.11.05 |
[바킹독의 실전 알고리즘] 0x04강 - 연결 리스트 (0) | 2023.11.04 |
[바킹독의 실전 알고리즘] 0x03강 - 배열 (1) | 2023.11.04 |
[바킹독의 실전 알고리즘] 0x01강 - 기초 코드 작성 요령 I (0) | 2023.11.04 |