C++ 배열 형태의 vector 매개변수

조회수 5573회
#include <iostream>
#include <vector>

// Ascending order
void bubbleSort(std::vector<int> arr) { <--- !
    int length = (int)arr.size();
    int temp = 0;

    for (int i = 0; i < length; ++i) {
        for (int j = 0; j < length - (1 + i); ++j) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

int main() {
    std::vector<int> inputArr = {5, 3, 1, 2, 7, 6, 4};
    bubbleSort(inputArr);

    for (int i : inputArr) {
        std::cout << i << " ";
    }
    std::cout << "\n";

    return 0;
}

이 코드를 실행해 보면, bubbleSort() 함수 내부에서는 arr 배열의 정렬이 잘 되는데 main() 함수에서는 정렬되지 않은 상태 그대로 나옵니다.

혹시 매개변수 arr이 inputArr과 동일한 벡터를 참조하는 게 아닌, 원소 값만 복사된 새 벡터를 할당받는 건가요?

자바에서는 이와 동일한 코드를 실행했을 때, 매개변수가 inputArr과 동일한 배열을 참조해서 별도의 함수 반환문이 필요가 없었는데...약간 헷갈리네요.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 정확히 진단하셨습니다.
    JAVA, C#과 같은 언어에서는 기본적으로 변수가 참조로 동작하기 때문에 저렇게 작성해도 원하는 결과가 나옵니다.
    그러나 C++에서는 저렇게 하면 복사(복사 생성자 호출)가 되기 때문에 참조로 받기 위해서 '&' 기호를 사용해야 합니다.

    // Ascending order
    void bubbleSort(std::vector<int>& arr) {
        int length = (int)arr.size();
        int temp = 0;
    
        for (int i = 0; i < length; ++i) {
            for (int j = 0; j < length - (1 + i); ++j) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)