pair와 tuple
pair는 두개의 값, tuple은 3개 이상의 값을 함께 묶어서 다닐 때 유용한 STL이다.
좌표를 설정할 때 pair 또는 tuple을 사용한다.
배열에 관하여 알고리즘 공부를 하다가 띠용하는 일이 벌어져서 이 글에 조금 정리해둔다.
배열의 -1번째 index에 값이 할당이 되는 것처럼 보인다(?)
전에 작성한 글의 연습문제 2번에서 내가 처음 짠 코드이다(배열 값을 잘 보이게 출력하기 위해 조금 수정함)
arr[] = {0, 0, 0} 배열이라 할 때 코드를 실제로 돌려보면 위 스샷과 같이 에러없이 배열의 -1번째 index에 값이 3으로 제대로 할당이 되는 것을 알 수 있다.
게다가 freq[3]도 존재하지 않는 인덱스임에도 불구하고 0이 출력된다.
반면 arr[-1]과 arr[3]은 예상에 맞게 쓰레기값이 출력된다.
왜??? 그런지 여러가지로 검색해봤는데 전역변수와 지역변수가 할당받는 메모리가 다르다는 것 말고는 딱히 이유를 알 수 없었다.
지역변수는 stack에 할당되고, 전역변수는 data에 할당된다. 참고글
또한 전역변수는 초기화하지 않아도 전부 0으로 초기화된다는 점? 하지만 경계를 넘어선 값을 참조할 때도 그런지는 잘 모르겠다.
확실한 건 전역변수든 지역변수든 배열의 크기를 넘어서면 에러가 날 가능성이 있다는 점! 전역배열로 할당했을 때 바운더리 밖에서도 코드가 잘 돌아간다고 해서 그걸 보장할 수 있는 것은 아니다.
Range-based for loop(C++11 이상에서 지원)
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = { 1, 2, 3, 4, 5 };
for (auto e : arr) {
cout << "e: " << e << " ";
}
}
범위 기반 for문이 기존 for문과 다른 점
- 범위 기반 for문은 배열과 vector 등 순회가 가능한 데이터타입을 처음부터 끝까지 순회하는 연산을 한다.
-> 섬세한 조절이 힘들다. - 범위 기반 for문은 순회할 때 element에 배열의 값을 복사한다(deep copy).
-> O(N)의 시간복잡도를 가진다.
배열과 포인터
배열은 포인터와 조금 유사한 면이 있다.
배열과 포인터는 모두 ‘주소’를 나타낸다.
배열과 포인터 모두 ‘*’ 연산과 ‘[]’ 연산이 가능하다.
C/C++에서 pointer(*)와 reference(&)의 차이점
Pointers vs References in C++ 정리 링크
포인터와 참조자의 정의
포인터는 다른 변수의 주소를 저장하는 변수이다.
참조자는 이미 존재하는 변수에게 새로운 이름을 주는 것이다.
변수 초기화
포인터는 선언만 하고 초기화 하지 않을 수도 있다.
참조자는 선언과 함께 초기화까지 해주어야 한다.