std :: array와 std :: vector의 차이점은 무엇입니까? 언제 다른 것을 사용합니까? [복제]
이 질문에는 이미 답변이 있습니다.
차이점은 무엇이며 std::array
그리고 std::vector
? 언제 다른 것을 사용합니까?
나는 항상 std:vector
C 배열을 사용하는 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::array
or 보다 간단한 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
. 또한 매우 효율적입니다.
'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 |