c++ 함수를 만들때 배열을 인자로 받을때 &을 사용하는 방법에 대하여.

처음에 함수를 만들때 기존에 전역으로 선언한 배열들을 인자로 받고 싶은데, 복사해서 받는것이 아니라 참조로 받고 싶었는데, 배열에 어떤식으로 &을 붙여야 이걸 복사로 받지 않고 참조로 받는지 몰라서 일단은 boj 2617번 문제를 해결할때 내가 작성한 코드를 확인해보면, 

void dfs(int st, int cnt[], vector<int> adj[]){
    // cnt[st]++;
    vis[st]=true;
    for(auto nxt: adj[st]){
        if(vis[nxt]) continue;
        cnt[nxt]++;
        dfs(nxt, cnt, adj);
    }
}

이런식으로 만들어서 일단 문제를 해결했다. 

 

그리고 이번 문제와 관련되어서 참고 코드를 확인해보니까 복사하지 않고 참조로 배열을 받는 방법을 

bool solve(int st, vector<int> (&adj)[]) { /* <== 바로 여기서 (&adj)[] 형태로 사용*/
  fill(vis, vis + n + 1, 0);
  queue<int> q;

  q.push(st);
  vis[st] = 1;

  int cnt = 0;
  while(!q.empty()) {
    int cur = q.front(); q.pop();
    for(int nxt : adj[cur]) {
      if(vis[nxt]) continue;
      q.push(nxt);
      vis[nxt] = 1;
      cnt++;
    }
  }
  return cnt >= (n + 1)/2;
}

위와 같이 인자로 넣을때, vector<int> (&adj)[] 형태로 작성한 것을 볼 수 있다. 

기존에 vector<int> &adj[]로 시도 해보았는데, 이렇게 시도하면, 

이와 같은 형태로 에러 메시지를 받게 되는데,

배열을 참조 형식으로 받기 위해서는 이렇듯 (&adj)[] 형태처럼 괄호를 이용하여서 &과 배열의 이름을 같이 묶어주고 난 뒤에 뒤에 [ ] 를 붙여 주어야 한다는걸 이번 풀이를 통해 알게되었다.

 다음에도 만약 이런식으로 배열을 받는 함수를 만들고 싶고, 그 함수를 복사가 아니라 참조를 통해서 가져오고 싶으면, 

배열의 이름과 &을 함께 괄호() 로 감싸주고, 그 뒤에 [ ] 를 붙여주도록 하자. 

 

  Comments,     Trackbacks