development

std :: array와 std :: vector의 차이점은 무엇입니까?

big-blog 2020. 7. 24. 07:17
반응형

std :: array와 std :: vector의 차이점은 무엇입니까? 언제 다른 것을 사용합니까? [복제]


이 질문에는 이미 답변이 있습니다.

차이점은 무엇이며 std::array그리고 std::vector? 언제 다른 것을 사용합니까?

나는 항상 std:vectorC 배열을 사용하는 C ++ 방식으로 사용하고 고려 했으므로 차이점은 무엇입니까?


std::array고전적인 C 배열의 클래스 버전입니다. 즉, 크기는 컴파일 타임에 고정되며 단일 청크로 할당됩니다 (예 : 스택에서 공간 확보). 객체와 배열 된 데이터 사이에 간접적 인 정보가 없기 때문에 성능이 약간 더 좋습니다.

std::vector힙에 대한 포인터를 포함하는 작은 클래스입니다. (따라서을 할당 std::vector하면 항상을 호출합니다 new.) 배열 된 데이터에 도달하기 위해 포인터를 쫓아 야하기 때문에 액세스하는 데 약간 느립니다 ... 그러나 그 대신에 크기를 조정할 수 있고 사소한 만 걸립니다 아무리 크든 스택 공간의 양.

[편집하다]

정직하게 std::vector당신이 원하는 것입니다. 스택에 큰 객체를 만드는 것은 일반적으로 눈살을 찌푸리게하며 일반적으로 여분의 간접적 인 수준은 관련이 없습니다. 예를 들어 모든 요소를 ​​반복하는 경우 추가 메모리 액세스는 루프 시작시 한 번만 발생합니다.

벡터의 요소는 연속적인 것이 보장되므로 &vec[0]배열에 대한 포인터를 기대하는 모든 함수에 전달할 수 있습니다 . 예를 들어, C 라이브러리 루틴. (제외 적 std::vector<char> buf(8192);으로 read/write직접 호출하지 않고 호출하거나 유사한 호출에 로컬 버퍼를 할당하는 좋은 방법 new입니다.)

즉, 여분의 간접적 인 수준과 컴파일 타임 상수 크기의 부족으로 std::array인해 생성 / 파기 / 액세스가 많은 초소형 어레이의 경우 훨씬 더 빨라질 수 있습니다 .

따라서 내 충고는 다음과 같습니다. std::vector(a) 프로파일 러가 문제가 있고 (b) 배열이 작지 않다면 사용 하지 마십시오 .


std :: array는 컴파일 타임 크기가 고정되어 있고 std :: vector는 가변 크기라는 것을 알고 있다고 가정합니다. 또한 std :: array가 동적 할당을 수행하지 않는다는 것을 알고 있다고 가정합니다. 대신 std :: vector 대신 std :: array를 사용하는 이유에 대해 대답하겠습니다 .

이 작업을 수행 한 적이 있습니까?

std::vector<SomeType> vecName(10);

그리고 실제로 std :: vector의 크기를 늘리지 마십시오. 그렇다면 std :: array가 좋은 대안입니다.

그러나 실제로 std :: array (이니셜 라이저 목록과 결합)는 C 스타일 배열을 거의 완전히 쓸모 없게 만듭니다. 그들은 일반적으로 std :: vectors와 경쟁하지 않습니다. 그들은 C 스타일 배열과 더 경쟁합니다.

C 스타일 배열의 거의 모든 합법적 인 사용을 없애기 위해 최선을 다하는 C ++위원회라고 생각하십시오.


std::array

  • 골재입니다
  • 고정 크기입니다
  • 요소가 기본 구성 가능해야 함 (vs 복사 (C ++ 03) 또는 이동 (C ++ 0x) 구성 가능)
  • 선형 교환 가능
  • 직선으로 움직일 수 있음 (일정 시간 대)
  • 잠재적으로 하나보다 적은 간접 비용을 지불 std::vector

C ++의 장점을 유지하고 원시 배열의 모든 나쁜 것들을 방해하지 않고 '금속에 가깝게'일을 할 때 좋은 사용 사례입니다.


C 대신 정적 배열을 사용할 때와 같은 추론 std::vector. 그리고 그것을 위해, 나는 당신을 친절하게 여기에서 참조합니다 .


std::array(컴파일 타임) 크기는 고정되어 있지만 std::vector커질 수 있습니다.

따라서 메모리를 동적으로 할당 std::array하는 std::vector것과 마찬가지로 C 배열을 사용하는 것과 같습니다.


나 자신의 개인 핸드 코딩 Array<>템플릿 클래스를 사용하는데,이 클래스는 std::arrayor 보다 간단한 API를 가지고 std::vector있습니다. 예를 들면 다음과 같습니다.

동적 배열을 사용하려면

Array<>  myDynamicArray; // Note array size is not given at compile time
myDynamicArray.resize(N); // N is a run time value

...

컴파일 타임에 정적 크기 고정 크기를 사용하려면

Array<100> myFixedArry;

std::array또는 보다 구문이 더 좋다고 생각합니다 std::vector. 또한 매우 효율적입니다.

참고 : https://stackoverflow.com/questions/6632971/what-is-the-difference-between-stdarray-and-stdvector-when-do-you-use-one-o

반응형

'development' 카테고리의 다른 글

fpermissive 플래그는 무엇을합니까?  (0) 2020.07.24
WPF에 Main ()이 없습니까?  (0) 2020.07.24
레일에서 루비  (0) 2020.07.24
LINQ, Where () 및 FindAll ()  (0) 2020.07.24
포인터, 스마트 포인터 또는 공유 포인터?  (0) 2020.07.24