inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

2380

go122345

작성한 질문수 9

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번 연구소문제입니다!

C++ 코테 준비 같이 해요!

답변 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

 

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

 

감사합니다. 

0

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

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

1-E질문입니다!

0

533

2

3-L 틀린 부분 피드백 부탁드립니다.

0

835

2

1-A문제 순열재귀함수 질문입니다.

0

396

1

1-A 일곱난쟁이문제입니다

0

469

1

문제 풀 때 방향성에 대해

0

809

1

맥에서 vs code로 실행 관련 질문입니다

0

530

1

17071번 메모리 초과

0

389

1

1-C질문입니다!

0

428

2

2-B BFS 시간초과질문

0

638

2

1-O 13번 라인

0

446

1

6-J 놀이공원 문제 질문

0

389

1

구현관련 질문

0

491

1

강의 교안

0

321

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

550

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

540

1

1-K

0

481

2

3-G번 질문있습니다.

1

480

3

3-C 실행 시간 질문드립니다.

0

503

1

4-A 문제 풀이 질문있습니다.

0

601

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

441

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

349

1

3-O go 함수 질문 드립니다.

1

453

2

4-A 출력 질문

0

307

1

1주차 1-O 질문드립니다

0

265

1