벡터는 값 또는 C ++의 참조로 함수에 전달됩니다.


97

저는 C ++로 코딩하고 있습니다. 함수가 void foo(vector<int> test)있고 프로그램에서 호출하면 벡터가 값이나 참조로 전달됩니까? 벡터와 배열이 비슷하고 함수 void bar(int test[])가 값 대신 참조 (포인터?)로 테스트를 통과 한다는 것을 알고 있기 때문에 확실하지 않습니다 . 내 생각 엔 값으로 전달하지 않으려면 포인터 / 참조로 벡터를 명시 적으로 전달해야하지만 확실하지 않습니다.


5
C ++에는 "값으로 전달"의미가 있으므로 값으로 전달됩니다. 그래도 참조로 전달하기로 결정할 수 있습니다. 선택은 실제로 함수의 기능에 따라 다릅니다.
juanchopanza

2
함수가 벡터 내용을 변경하지 않으려면 참조로 사용하고, 그렇지 않으면 참조로 전달하십시오. 원하지 않고 비용이 많이 드는 (때때로) 복제를 방지합니다.
Ali Kazmi 2014 년

3
또한 참조는 포인터가 아닙니다.
상자성 크로

2
@AliKazmi 함수 본문에 복사본을 원하는 경우는 예외입니다.
juanchopanza

달성하려는 목표에 따라 다릅니다. 표준 스마트 포인터 중 하나를 사용하는 것이 때때로 유용합니다. 예를 들어 소유권을 전달하려는 경우 unique_ptr을 사용합니다. 그러나 일반적으로 std :: vector를 참조로 전달합니다.
Erik Alapää 2014 년

답변:


136

내가 추측해야한다면 Java 배경 출신이라고 말하고 싶습니다. 이것은 C ++이며 &-operator를 사용하여 달리 지정하지 않는 한 값으로 전달됩니다 (이 연산자는 'address-of'연산자로도 사용되지만 다른 컨텍스트에서 사용됨). 이것은 모두 잘 문서화되어 있지만 어쨌든 다시 반복하겠습니다.

void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo)
void foo(vector<int> const &bar); // by const-reference

벡터 ( void foo(vector<int> *bar))에 대한 포인터를 전달하도록 선택할 수도 있지만 수행중인 작업을 알 수없고 이것이 정말로 갈 길이라고 생각하지 않는 한이 작업을 수행하지 마십시오.

또한 벡터는 배열과 동일 하지 않습니다 ! 내부적으로 벡터는 메모리 관리를 처리하는 배열을 추적하지만 다른 많은 STL 컨테이너도 마찬가지입니다. 포인터 또는 배열을 기대하는 함수에 벡터를 전달할 수 없으며 그 반대의 경우도 마찬가지입니다 (기본 배열에 액세스 (포인터)하여 사용할 수 있음). 벡터는 멤버 함수를 통해 많은 기능을 제공하는 클래스 인 반면 포인터와 배열은 내장 유형입니다. 또한 벡터는 동적으로 할당되며 (즉, 런타임에 크기가 결정되고 변경 될 수 있음) C 스타일 배열은 정적으로 할당되며 (크기는 일정하며 컴파일 타임에 알려야 함) 사용을 제한합니다.

일반적으로 C ++ (특히 array decay ) 에 대해 좀 더 읽어 보고 배열과 포인터의 차이점을 보여주는 다음 프로그램을 살펴 보는 것이 좋습니다.

void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }

int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    foo1(arr);
    foo2(arr);
    foo3(arr);
    foo4(arr);
}

2
아무도 내가 마지막 선언 foo4 함수를 이해하도록 도울 수 있습니까? 왜 다른 함수 에서처럼 포인터의 크기 대신 배열의 크기를 반환합니까?
abhishek_M

3
@abhishek_M 매개 변수 유형이 참조이기 때문입니다. 참조는 정확히 동일한 유형의 식에만 바인딩 될 수 있습니다. 이러한 이유 때문에 배열에 대한 참조가 포인터에 바인딩 될 수 없기 때문에 배열이 붕괴되지 않습니다. 동일한 유형의 배열에만 바인딩 될 수 있습니다 (이 경우 10 개의 정수 배열)
bolov

1
C ++ 11에는 "이동 의미 체계"가 있으며 신중하게 수행하고 복사없이 값으로 전달할 수 있습니다 (이동 의미 체계 포함). 여기 저에게 많은 도움이 된 링크가 있습니다 : mbevin.wordpress.com/2012/11/20/move-semantics
fchen

24

A vector는 배열과 기능적으로 동일합니다. 그러나 언어 vector는 유형 int이며 또한 유형입니다. 함수 인수에 대해 모든 유형 (포함 vector[]) 의 배열은 포인터로 처리됩니다. A vector<int>int[]컴파일러 와 동일하지 않습니다 . vector<int>비 배열, 비 참조, 비 포인터-값으로 전달되고 있으므로 copy-constructor를 호출합니다.

따라서 참조로 전달 하려면 vector<int>&( const함수가 수정하지 않는 경우 가급적으로와 함께 ) 사용해야합니다.


함수를 참조하여 "벡터 배열"을 전달하는 구문은 무엇입니까?
ab123

void functionName (std :: vector <int> (& vc) [5]) {}
RIanGillis

9

void foo(vector<int> test)

벡터는 이것의 값으로 전달됩니다.

컨텍스트에 따라 벡터를 전달하는 더 많은 방법이 있습니다.

1) 참조로 전달 :-이것은 함수 foo가 벡터의 내용을 변경하도록합니다. 벡터 복사를 피하므로 값을 전달하는 것보다 효율적입니다.

2) 상수 참조로 전달 :-함수가 벡터의 내용을 변경하지 않도록 할 때 효율적이고 신뢰할 수 있습니다.


1

함수의 값으로 벡터를 인수로 전달하면 단순히 벡터의 복사본을 생성하고 특정 함수를 호출 할 때 주 함수에 정의 된 벡터에는 아무런 영향도 미치지 않습니다. 특정 함수에 쓰여진 것이 무엇이든 참조로 벡터를 전달할 때, 모든 작업은 특정 함수를 호출 할 때 main 또는 다른 함수에 정의 된 벡터에서 수행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.