2014-11-13 2 views
3

std :: begin()std :: end()은 배열과 관련하여 작동하지만 포인터 [거의 배열입니다] 및 배열 [원래 배열의 별칭]의 참조는 작동하지 않습니다.std :: begin 및 std :: end가 포인터와 참조로 작동하지 않는 이유는 무엇입니까?

내 머리를 15 분 동안 긁어 낸 후에는 Google에서 아무 것도 얻을 수 없습니다.

아래의 첫 번째 사례는 두 번째 및 세 번째가 아닌 다음과 같은 이유 때문일 수 있습니다.

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    int first[] = { 5, 10, 15 }; // Fist Case 

    if (std::find(std::begin(first), std::end(first), 5) != std::end(first)) { 
     std::cout << "found a 5 in array a!\n"; 
    } 

    int *second = new int[3]; // Second Case 
    second[0] = 5; 
    second[1] = 10; 
    second[2] = 15; 
    if (std::find(std::begin(second), std::end(second), 5) != std::end(second)) { 
     std::cout << "found a 5 in array a!\n"; 
    } 

    int *const&refOfFirst = first; // Third Case 

     if (std::find(std::begin(refOfFirst), std::end(refOfFirst), 5) != std::end(refOfFirst)) { 
     std::cout << "found a 5 in array a!\n"; 
    } 
} 

오류 : 배열의 시작에 불과 포인터를 감안할 때

error: no matching function for call to ‘begin(int&)’ 
    if (std::find(std::begin(*second), std::end(*second), 5) != std::end(*second)) { 
           ^
+6

세 번째 경우는 배열이 아니라 포인터를 참조합니다. –

+0

언제부터 포인터가 "거의 배열"입니까? –

답변

8

, 배열의 크기를 결정하는 방법이 없습니다; 따라서 beginend은 동적 배열에 대한 포인터에서 작동 할 수 없습니다.

크기를 알고있는 동적 배열을 원하면 std::vector을 사용하십시오. 또한 보너스로 메모리 누수가 해결됩니다.

포인터를 다시 사용하기 때문에 세 번째 케이스가 실패합니다. 당신은 배열 자체에 대한 참조를 사용할 수 있습니다

int (&refOfFirst)[3] = first; 

또는 배열의 크기를 지정하는 것을 피하기 위해 :

auto & refOfFirst = first; 

beginend들이 first에서 작동하는 것처럼 정확히에서 작동을 그 자체.

+0

감사합니다. @Mike Seymour –

+1

"배열의 시작 위치에 대한 포인터 만 있으면 배열의 크기를 결정할 방법이 없으므로 동적 배열에 대한 포인터에서 시작과 끝을 처리 할 수 ​​없습니다." '시작 '. 나는'T * begin (return * ptr) {return ptr;} '이 존재하는 것이 합리적인 일반 프로그래밍 사례를 보았다. – alfC

관련 문제