STL과 함수 인자
함수인자
void func(int a) {
a = 5;
}
int main(void) {
int t = 0;
func(t);
cout << t;
}
int를 함수 인자로 보내면 값이 복사돼서 넘어가기 때문에 함수에서 값을 바꾸더라도 main의 변수 t에는 아무런 영향 X
void func(int arr[]) {
arr[0] = 10;
}
int main(void) {
int arr[3] = {1, 2, 3};
func(arr);
cout << arr[0];
}
함수에 int 배열 arr를 인자를 주는게 arr의 주소를 넘겨주는 것. 그래서 arr[0]을 함수에서 바꾸면 원본의 값도 바뀜
struct pt {
int x, y;
}
void func(pt a) {
a.x = 10;
}
int main(void) {
pt tmp = {0, 0};
func(tmp);
cout << tmp.x;
}
구조체의 경우에는 int랑 비슷하게 값이 전부 복사됨. 그래서 함수에서 값을 바꿔도 원본에는 영향 X
참조자(Reference)
void swap1(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
원본 2개를 바꾸고 싶은데 복사된 2개를 바꾸기 때문에 의미 없음.
void swap2(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
포인터를 보내서 두 변수의 값을 바꿀 수 있음.
void swap3(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
a와 b는 int reference, 함수 내부에서는 int값 처럼 사용하지만 원본을 바꾸는 과정이다.
참조자는 C에서의 포인터랑 거의 비슷한 기능을 하지만
포인터에서 Null Pointer 값을 넣는다거나 type이 다른걸 캐스팅하는 문제들을 완화 시켜주는 패러다임이다.
STL(Standard Template Library)
vector
C++에서는 배열을 선언할 때 크기를 명시해야 하고 무조건 해당 크기안에서만 사용을 해야한다.
vector는 일종의 가변배열로 크기를 마음대로 늘렸다 줄였다 할 수 있다.
vector<int> v(100);
v[20] = 10;
v[60] = -4;
01번째 줄같이 선언하면 type이 int이고 0으로 초기화된 100칸짜리 가변배열 v가 선언되고
02, 03번째 줄처럼 일반적인 배열을 쓰듯이 인덱스에 접근해서 값을 바꿀 수 있다.
STL을 함수 인자로 넘길 때
void func1(vector<int> v) {
v[10] = 7;
}
int main(void) {
vector<int> v(100);
func1(v);
cout << v[10];
}
STL을 함수 인자를 넘길 때 구조체랑 비슷하게 복사본을 만들어서 보내기 때문에 원본에 영향 X
bool cmp1(vector<int> v1, vector<int> v2, int idx) {
return v1[idx] > v2[idx];
}
이 함수의 시간복잡도는 O(N)
함수 안에서는 연산을 1번 하지만 v1, v2를 인자로 실어서 보낼 때 원본으로부터 복사본을 만드는 비용도 생각해야함
bool cmp2(vector<int>& v1, vector<int>& v2, int idx) {
return v1[idx] > v2[idx];
}
이 함수는 cmp2가 호출될 때 복사본을 따로 만들어내지 않고 참조 대상의 주소 정보만 넘어가기 때문에
시간복잡도는 O(1)
표준 입출력
scanf / printf 는 C++ 의 string을 처리할 수 없음
ios::sync_with_stdio(0)
cin.tie(0)
을 선언하면 scanf / printf 사용하면 안됨
endl 절대 사용 X
줄바꿈이 필요하면 \n 출력
'알고리즘' 카테고리의 다른 글
[알고리즘] BOJ 1463번 / 1로 만들기 (0) | 2023.01.07 |
---|---|
[알고리즘] C++ 여러가지 자료형 (feat. 바킹독) (0) | 2022.11.20 |
STL과 함수 인자
함수인자
void func(int a) {
a = 5;
}
int main(void) {
int t = 0;
func(t);
cout << t;
}
int를 함수 인자로 보내면 값이 복사돼서 넘어가기 때문에 함수에서 값을 바꾸더라도 main의 변수 t에는 아무런 영향 X
void func(int arr[]) {
arr[0] = 10;
}
int main(void) {
int arr[3] = {1, 2, 3};
func(arr);
cout << arr[0];
}
함수에 int 배열 arr를 인자를 주는게 arr의 주소를 넘겨주는 것. 그래서 arr[0]을 함수에서 바꾸면 원본의 값도 바뀜
struct pt {
int x, y;
}
void func(pt a) {
a.x = 10;
}
int main(void) {
pt tmp = {0, 0};
func(tmp);
cout << tmp.x;
}
구조체의 경우에는 int랑 비슷하게 값이 전부 복사됨. 그래서 함수에서 값을 바꿔도 원본에는 영향 X
참조자(Reference)
void swap1(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
원본 2개를 바꾸고 싶은데 복사된 2개를 바꾸기 때문에 의미 없음.
void swap2(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
포인터를 보내서 두 변수의 값을 바꿀 수 있음.
void swap3(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
a와 b는 int reference, 함수 내부에서는 int값 처럼 사용하지만 원본을 바꾸는 과정이다.
참조자는 C에서의 포인터랑 거의 비슷한 기능을 하지만
포인터에서 Null Pointer 값을 넣는다거나 type이 다른걸 캐스팅하는 문제들을 완화 시켜주는 패러다임이다.
STL(Standard Template Library)
vector
C++에서는 배열을 선언할 때 크기를 명시해야 하고 무조건 해당 크기안에서만 사용을 해야한다.
vector는 일종의 가변배열로 크기를 마음대로 늘렸다 줄였다 할 수 있다.
vector<int> v(100);
v[20] = 10;
v[60] = -4;
01번째 줄같이 선언하면 type이 int이고 0으로 초기화된 100칸짜리 가변배열 v가 선언되고
02, 03번째 줄처럼 일반적인 배열을 쓰듯이 인덱스에 접근해서 값을 바꿀 수 있다.
STL을 함수 인자로 넘길 때
void func1(vector<int> v) {
v[10] = 7;
}
int main(void) {
vector<int> v(100);
func1(v);
cout << v[10];
}
STL을 함수 인자를 넘길 때 구조체랑 비슷하게 복사본을 만들어서 보내기 때문에 원본에 영향 X
bool cmp1(vector<int> v1, vector<int> v2, int idx) {
return v1[idx] > v2[idx];
}
이 함수의 시간복잡도는 O(N)
함수 안에서는 연산을 1번 하지만 v1, v2를 인자로 실어서 보낼 때 원본으로부터 복사본을 만드는 비용도 생각해야함
bool cmp2(vector<int>& v1, vector<int>& v2, int idx) {
return v1[idx] > v2[idx];
}
이 함수는 cmp2가 호출될 때 복사본을 따로 만들어내지 않고 참조 대상의 주소 정보만 넘어가기 때문에
시간복잡도는 O(1)
표준 입출력
scanf / printf 는 C++ 의 string을 처리할 수 없음
ios::sync_with_stdio(0)
cin.tie(0)
을 선언하면 scanf / printf 사용하면 안됨
endl 절대 사용 X
줄바꿈이 필요하면 \n 출력
'알고리즘' 카테고리의 다른 글
[알고리즘] BOJ 1463번 / 1로 만들기 (0) | 2023.01.07 |
---|---|
[알고리즘] C++ 여러가지 자료형 (feat. 바킹독) (0) | 2022.11.20 |