1 분 소요

C++ 주의해야할 점

STL과 함수 인자

함수인자

#include<iostream>
using namespace std;
void func(int a){
    a=5;
}
int main(void){
    int t=0;
    func(t);
    cout<<t; // 0
}
// 값이 복사되어 넘어가서 변하지 않음.
#include<iostream>
using namespace std;
void func(int arr[]){
    arr[0]=10;
}
int main(void){
    int arr[3]={1,2,3};
    func(arr);
    cout<<arr[0]; // 10
}
// arr의 주소를 넘겨줌
#include<iostream>
using namespace std;
struct pt{
    int x,y;
};
void func(pt a){
    a.x=10;
}
int main(void){
    pt tmp={0,0};
    func(tmp);
    cout<<tmp.x; // 0
}
// 값이 다 복사되기 때문에 영향을 주지 않음

참조자(Reference)

  • 참조자를 쓰면 원본을 바꿈
    void swap(int* a,int* b){
      int tmp = *a;
      *a=*b;
      *b=tmp;
    }
    void swap(int& a,int& b){
      int tmp=a;
      a=b;
      b=tmp;
    }
    // 참조자를 쓰면 원본을 바꿈
    

    STL vector

  • STL도 구조체와 비슷하게 함수 인자로 보내면 복사본을 보내기 때문에 원본에 영향을 주지 않음
    #include<iostream>
    #include<vector>
    using namespace std;
    void func1(vector<int> v){
      v[10]=7;
    }
    int main(void){
      vector<int> v(100);
      func1(v);
      cout<<v[10]; // 0
      return 0;
    }
    // STL도 구조체와 비슷하게 함수 인자로 보내면 복사본을 보내기 때문에 원본에 영향을 주지 않음
    

    comp함수(sort)

  • 시간복잡도: O(N)
    bool cmp1(vector<int> v1,vector<int> v2,int idx){
      return v1[idx]>v2[idx];
    }
    // 시간복잡도 O(N) v1,v2를 복사하기 때문에
    
  • 시간복잡도: O(1)
    bool cmp2(vector<int>& v1,vector<int>&& v2,int idx){
      return v1[idx]>v2[idx];
    }
    // 시간복잡도 O(1) 참조대상의 주소 정보만 넘어가기 때문에
    

    표준 입출력

  • 공백을 포함한 문자열 입력
    int main(void){
      string s;
      getline(cin,s);
      cout<<s;
      return 0;
    }
    
  • 입출력으로 인한 시간초과 막기
    ios::sync_with_stdio(0); // C++ stream과 C stream의 동기화 끊기
    cin.tie(0); // cin 명령을 수행하기 전에 cout 버퍼를 비우지 않도록 함
    
  • endl 쓰지 않기!!