2013-10-23 6 views
1

C++ 11의 배열 (c-style 또는 std :: array)에서 벡터를 초기화하는 여러 가지 방법을 보았습니다. 다음과 같은 배열이 있다고 가정하십시오 : uint8_t arr[5000] 또는 예 : std::array<uint8_t, 5000> arr;. 내가 편곡에서 5000 개 값을 원하는 경우벡터 초기화

, 나는이 방법을 초기화 할 수 있습니다 : 편곡이 std::array<uint8_t, 5000>)

경우

  • std::vector<uint8_t> vect(arr.begin(), arr.end());

    1. std::vector<uint8_t> vect(arr, arr + 5000);

    2. std::vector<uint8_t> vect(std::begin(arr), std::end(arr));이 하나가 적용

    this answer에 따르면 옵션 3은 옵션 1 및 2보다 좋습니다. 비회원 기능 대신 컨테이너의 멤버 기능을 사용하는 것이 좋습니다.

    나는 항상 C 스타일 배열의 첫 번째 옵션을 보았습니다. 옵션 1은 옵션 2와 정확히 동일합니까? 그 뒤에있는 미묘한 점은 무엇입니까?

    도움 주셔서 감사합니다.

  • +0

    사실, 모든 대답은 옵션 2보다 옵션 2를 사용하는 것이 좋습니다 - 실제로'begin()'과'end()'메소드를 구현하는 컨테이너의 경우, 어쨌든 똑같은 일을합니다. 또한 C 스타일 배열에서도 작동합니다. 시작과 끝 반복자를 얻기위한 비표준 메소드를 가진 이상한 컨테이너가 있다면, 항상 자유로운'begin'과'end' 함수를 작성할 수 있습니다. –

    +0

    ** 당신이 **에 링크 한 질문에서 허용되는 대답은 회원 기능을 사용하는 것이 더 낫다고 말하지 않습니다. 그는 단순히 C 스타일 배열에서도 자유 함수'begin'과'end'가 작동한다는 것을 지적하고 있습니다.나는 정확히 그 이유 때문에 자유로운 기능을 고수 할 것입니다. – Praetorian

    +0

    또한 옵션 1에는 오프셋을 실제로 알 필요가 있다는 명백한 단점이 있습니다. :) –

    답변

    2

    선호되는 방법은 벡터에 값을 직접 두는 것입니다. 벡터에 값을 넣는 대신 배열에 넣은 다음 벡터를 사용하여 벡터를 초기화하는 것이 가장 좋습니다.

    무료 기능을 사용하는 버전 std::beginstd::end이 일반적으로 대안보다 더 좋습니다. 소스가 배열 std::vectorstd::array이거나 std::list 또는 std::set과 같은 다른 컨테이너 중 하나인지 여부에 관계없이 작동합니다.

    후자는 분명히 제네릭 코드에서 가장 중요하므로 원본 컨테이너의 유형과 독립적 일 수 있습니다. 그러나 다른 경우에도 본질적으로 모든 유형의 입력에 대해 동일한 구문을 사용할 수있게되면 더 높은 수준의 패턴으로 인식 할 수있는 또 하나의 이점이 생기므로 어떤 일을하는지 파악하는 데 두뇌주기를 낭비 할 필요가 없습니다.

    1. 당신은 beginend 무료 기능을 구현하지 않는 오래된 컴파일러로 코드를 이식해야 할 수도 있습니다

      두 명백한 단점이 있습니다. 필자의 의견으로는 필요한 경우 최소한의 노력으로 직접 구현하는 것이 가장 좋습니다.

    2. container.begin()container.end()을 많이 사용하는 기존 코드베이스가 있습니다. 자유 함수를 사용하기 위해 기존의 큰 코드베이스를 수정하는 것은 실용적이지 않을 수 있으며 x.begin()begin(x)이 혼합되어 있으면 가독성을 높이는 데 도움이되지 않습니다.