강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

go122345님의 프로필 이미지
go122345

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

vector들의 배열을 참조로 함수에 넘겨주고 싶습니다.

작성

·

2.3K

0

DFS BFS문제를 풀때 visited 와 맵같은걸 전부 전역변수로 해서 여태까지 큰 문제가 없었는데요!

문제를 다시 풀던 중에

DFS함수에 벡터배열 vector<int> _map[9];  같은 친구를 메인에서 선언하고 참조나 포인터로 넘기려고 하는데 빨간줄이 떠서 ??? 하구 구글링해봐도 명쾌한 해답을 얻을 수 없어서 질문 드립니다.

void DFS(int ny,int nx,vector<int> *m) {
    visited[ny][nx] = 1; cnt++;
    for (int i = 0; i < 4; i++) {
        if (ny + dy[i] <0 || ny + dy[i] >N || nx + dx[i] <0 || nx + dx[i] >M)
            continue;
        else if (visited[ny + dy[i]][nx + dx[i]] == 2 && m[ny + dy[i]][nx + dx[i]] == 0)
            DFS(ny + dy[i], nx + dx[i], m);
    }
}
int main(){
//어쩌구 저쩌구
DFS(i, j, _map); //_map은 메인에서 선언한 배열 이름입니다.
}
 
이렇게 작성하면 전역변수로 선언한 것 처럼 잘 작동하구 문제도 맞았습니다!! 받았어요. 이걸루 벡터의 이름도 배열의 이름처럼 주소로 쓸 수 있다는것도 알았습니다 그런데요,
 
그런데 여기서
void DFS(int ny,int nx,vector<int> &m) {
//어쩌구 저쩌구
}
int main(){
DFS(i, j, _map); //맵은 메인에서 선언한 벡터배열 vector<int> _map[9];
}
하면 안굴러가구 참조 배열을 사용할 수 없다구 컴파일러가 불평합니다.
 
제 미약한 지식으로 참조하구 포인터는 내부적으로(어셈블리?)거의 같다구 들었는데요.
 
여기서 어떻게해야 벡터배열vector<int> _map[9]; 이친구를 참조로 넘길 수 있을까요???
 
문제 번호는 2-P , 14502번 연구소문제입니다!

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요. ㅎㅎ

vector를 함수 매개변수로 만들어 변화시키기

함수 매개변수로 넘겨서 변화시키고 싶을 때는 다음과 같이 넘기면 됩니다. call by reference로 넘겨서 수정하게 해야 합니다. 

#include<bits/stdc++.h>
using namespace std;    
void f(vector<int> &v){
    v[0] = 100;
}
int main(){
    vector<int> v;
    for(int i = 1; i <= 3; i++)v.push_back(i);
    f(v);  
    for(int i : v) cout << i << " ";
    return 0;
}
// 100 2 3 

 

만약 vector<int> v[10] 이런꼴의 10개의 vector는 어떻게 넘길까요? 

#include<bits/stdc++.h>
using namespace std;    
void f(vector<int> v[10]){
    v[0][0] = 1000;
}
int main(){
    vector<int> v[10];
    v[0].push_back(100); 
    f(v);  
    for(int i : v[0]) cout << i << " ";
    return 0;
}
// 1000

 

또한 2차원 vector의 경우 어떻게 넘길까요? 

이렇게 넘기면 됩니다. 

#include<bits/stdc++.h>
using namespace std;    
void f(vector<vector<int>> &v){
    vector<int> vv;
    vv.push_back(10000);
    v.push_back(vv);
}
int main(){
    vector<vector<int>> v; 
    f(v);  
    for(int i : v[0]) cout << i << " ";
    return 0;
}
// 10000

 

이렇게 하시면 됩니다. 또한 해당 부분 교안에 업데이트 되서 업로드 하도록 하겠습니다. 

 

감사합니다. 

go122345님의 프로필 이미지
go122345
질문자

#include<bits/stdc++.h>
using namespace std;    
void f(vector<int> v[10]){
    v[0][0] = 1000;
}
int main(){
    vector<int> v[10];
    v[0].push_back(100); 
    f(v);  
    for(int i : v[0]) cout << i << " ";
    return 0;
}
// 1000

함수 호출하는쪽 매개변수 선언하는 쪽 어디에서 참조나 포인터 기호가 없는데 원본 값이 바뀌었네요. 약간 놀랍네요. 감사합니다

go122345님의 프로필 이미지
go122345

작성한 질문수

질문하기