void func(int a){
a = 5;
}
int main(void){
int t = 0;
func(t);
cout << t;
}
void func(int arr[]){
arr[0] = 10;
}
int main(void){
int arr[3] = {1, 2, 3};
func(arr);
cout << arr[0];
}
위 두 개의 코드의 실행결과는 어떨까?
각각 0, 10이다.
첫 번째는 int를 함수 인자로 보내면 값이 복사되어 넘어간다. 그러니 함수에서 값을 바꾼다고 main의 변수 t에는 영향을 줄 수 없다.
두 번째는 func에 int 배열 arr를 인자로 주는게 arr의 주소를 넘겨주니 arr[0]을 func 함수에서 바꾸면 원본의 값도 자연스럽게 바뀐다.
STL 은 C++에서 제공되는 라이브러리다.
그중 vector는 일종의 가변배열이다.
void func(vector<int> v){
v[10] = 7;
}
int main(void){
vector<int> v(100);
func1(v);
cout << v[10];
}
위 코드의 결과는? 0이다.
STL도 비슷하게 함수 인자로 실어 보내면 복사본을 만들어서 보내기 때문에 func1 함수에서 바꾼 것은 원본에 영향을 주지 않는다.
bool cmp1(vector<int> v1, vector<int> v2, int idx){
return v1[idx] > v2[idx];
}
이 코드의 시간복잡도는? O(N)이다.
왜냐하면, 아까도 말했듯이 인자로 실어보낼 때 복사본을 만들기 때문이다.
bool cmp2(vecto<int> &v1, vector<int>&v2, int idx){
return v1[idx] > v2[idx];
}
v1, v2의 type을 vector의 reference로 만들게 되면 cmp2가 호출될 때 복사본을 따로 만들지 않고 참조 대상의 주소 정보만 넘어가 시간복잡도는 의도한대로 O(1)이 된다.
scanf/printf의 아쉬운 점은 C++ string을 처리할 수가 없다.
scanf/printf를 쓰면서도 C++ string을 활용하고 싶으면 일단 char* 로 입력을 받고 string으로 형 변환을 해서 원하는 작업을 끝낸 후 c_str() 을 이용해 출력한다.
int main(void){
char a[10];
printf("input : ");
scanf("%s", a);
string s = a;
printf("a is %s\n", a);
printf("s is %s\n", s.c_str());
}
공백이 있는 문자열의 경우
string s;
getline(cin, s);
getline으로 받는 것이 가장 편하다.
cin/cout을 사용한다면 위의 두 명령을 실행시켜야 한다.
그래야 입/출력의 양이 많을 때 시간초과를 막을 수 있다.