int , int 배열, 구조체 인자를 함수로 넘길때 어떻게 될까
int를 함수 인자로 보내면 값이 복사돼서 넘어간다.
두번째는 arr[0]이 바뀌게 되는데, func에 int배열 arr를 인자로 주는게 arr의 주소를 넘겨주는 것이다.
그렇기 떄문에 arr[0]을 함수에서 바꾸면 원본의 값도 바뀌게 된다.
구조체의 경우도 int와 마찬가지로 복사본을 주기 때문에 func 함수에서 값을 바꿔도 원본에는 영향을 주지 않는다.
C까지는 포인터, 2번 사진
c++에서는 한가지 방법이 더, 바로 참조자 // 3번째 사진
3번째 사진에서 a와 b는 int 레퍼런스 인것이다.
세번째 사진처럼 레퍼런스를 이용하면 저게 다 원본을 바꾸는 것이다.
참조자는 c에서의 포인터랑 거의 비슷한 기능을 하지만 포인터에서 null pointer에 값을 넣는다거나
type이 다른걸 마음대로 캐스팅한다거나 하는 문제들을 덜 할 수 있게 해주는 패러다임
https://bloodstrawberry.tistory.com/271
이 게시글이 참조자와 포인터의 차이점에 대해서 기록해 놓은 글인데, 참고해볼만 하다.
그 중에서 눈에 띄는 부분은
이런 내용들이고, 그중에서도
포인터는 변수를 바꾸기 위해 *연산자를 이용하지만,
참조자는 이름만 바뀌었으므로 그대로 변경하면 된다.
라는 부분에서 포인터는 지속적으로 함수 내부에서 *를 붙여서 사용해주어야 하는데,
참조자는 함수 내부에서 그대로 & 없이 사용하는 부분을 설명하는 것이라는 것으로 보여진다.
바로 이 두 함수에서 차이점을 확인할 수 있다.
STL(standard template library) - vector
https://dev-record.tistory.com/26
array와 vector의 차이점에 대해서 검색했을때 보게된 내용.
동적으로 크기가 변한다는것이 차이점인것 같은데
여기서 vector와 list의 차이점은 뭘까 싶어서 검색했을때 나온 내용도 첨부해보면,
https://chanheess.tistory.com/154
리스트와 벡터의 차이를 따지자면 벡터의 경우 연속적인 메모리할당, 리스트의 경우는 비연속적인 메모리의 할당이 큰 차이로 보여진다. 아무래도 비연속적인 메모리 배치를 활용하는 list의 경우는 인자의 삽입 삭제가 용이할것이다.
vector의 경우 새롭게 요소를 추가하면 전체를 메모리에 재할당한다고 하는것 같은데,
위의 예시를 보면 vector를 선언할때는 array를 선언할때처럼 arr[100]처럼 대괄호를 사용하는것이 아니라
vector<int> v(100); 처럼 소괄호로 선언한다.
<STL을 함수 인자로 넘길때 주의해야할 사항>
STL도 구조체를 인자로 넘길때 복사본을 넘기듯이 함수에 복사본을 넘겨주기 때문에 원본에 영향을 주지 않는다.
cmp1의 경우 stl을 복사하기 때문에 시간복잡도가 하나의 원소를 비교하는 경우더라도 복사하는데 발생하는
시간을 고려해야해서 시간 복잡도는 O(N)이고
cmp2의 경우 cmp2가 호출될때 복사본을 따로 만들어내지 않고 참조 대상의 주소 정보만 넘어가기 때문에 시간 복잡도는 의도한대로 O(1)이 된다.
<scanf와 cin을 활용해서 문자열을 받을때 둘다 공백 앞까지만 입력 받는것을 알고있어야 한다 >
해결책으로는 3가지가 있다.
첫번째는 c언어에서 공백이 있는 부분까지 받는다는걸 표현하는 방법,
두번째는 gets함수를 사용하는 방법- 하지만 보안상의 이유로 c++14 이상에서는 제거되었다
세번째 getline 함수를 사용한다
이게 가장 좋은 방법이 될 것이다. 이 방법을 이해하고 이 방법을 사용하여 공백이 있는 문자열을 받도록 하자.
공백이 있는 문자열을 받아야 할때는?
getline 함수를 사용하여서 받도록 하자.
string s;
getline(cin,s);
cout<<s;
https://velog.io/@jxlhe46/C-getline-%ED%95%A8%EC%88%98
이 부분을 참고하여서 공부하여보자.
이 게시글에서 말하는 cin의 유의해야할 사항으로는
----------
*********
scanf/printf와 다르게 cin/cout은 입출력으로 인한 시간 초과를 막기 위해서
ios::sync_with_stdio(0);
cin.tie(0); 라는 두 명령어를 실행시켜야 한다.
이걸 안해두면 입/출력의 양이 많을때 시간초과가 날 수 있다.
c++ stream과 c stream이 기본적으로 동기화 되어있는데, 내가 c++ stream만 쓸거면 굳이 두 stream을 동기화 할 필요가 없다.
대신 동기화를 풀었으면 ios::sync_with_stdio(0); 를 해주었다면 절대 printf와 cout을 섞어쓰면 안된다.
지금까지 visual studio 2019를 사용해오고 있었는데 그냥 생각 안하고 ios::sync_with_stdio(0)을 사용해서 작성해왔는데 영향을 미치지 않는 상태였구나. 하지만 내가 응시하게 될 코딩테스트의 시험에서 채점서버는 gcc를 사용할것이기 때문에 차이를 발생시킬 것이다. 그러니 습관적으로 ios::sync_with_stdio(0); 을 사용하여서 답을 작성하도록 하자. 동기화를 끊는 것이라는것도 기억하자.
입력도 버퍼가 있어서 그걸 어느정도 모았다가 넘겨준다.
코딩테스트와 개발은 다르다.
강사의 경우는 이것보다 더 줄여서 이런식으로 작성하겠다고 한다.
줄바꿈 또한 출력 맨 마지막에 추가로 있어도 정답 처리가 된다.
그래서 이부분을 별도로 예외처리를 할 필요가 없다.
'알고리즘 > BOJ' 카테고리의 다른 글
0x06강 큐 (0) | 2023.02.02 |
---|---|
0x05강 스택 (0) | 2023.02.01 |
0x04강-연결리스트 (0) | 2023.01.28 |
0x03강 - 배열 (0) | 2023.01.26 |
0x01강-기초 코드 작성 요령 1 (0) | 2023.01.25 |