QVector
std::vector
이름에서 짐작할 수 있듯이 는 대부분과 유사합니다 . 와의 명백한 연관성에도 불구하고에 QList
더 가깝 boost::ptr_deque
습니다 std::list
. 개체를 직접 저장하지 않고 대신 개체에 대한 포인터를 저장합니다. 양쪽 끝에서 빠른 삽입의 모든 이점을 얻고 재 할당에는 복사 생성자 대신 포인터를 섞는 것이 포함되지만 실제 std::deque
또는 의 공간적 지역성을 잃고 std::vector
많은 힙 할당을 얻습니다. 작은 개체에 대한 힙 할당을 피하고 공간적 지역성을 되찾기 위해 몇 가지 의사 결정을 내렸지 만 내가 이해하는 바에 따르면 int
.
QLinkedList
와 유사하며 std::list
모든 단점이 있습니다. 일반적으로 이것은 컨테이너의 마지막 선택이어야합니다.
QT 라이브러리는 QList
객체 사용을 매우 선호하므로 자신의 코드에서 객체를 선호하면 때때로 불필요한 지루함을 피할 수 있습니다. 추가 힙 사용 및 실제 데이터의 임의 위치 지정은 이론적으로 일부 상황에서 손상 될 수 있지만 종종 눈에 띄지 않습니다. 그래서 QList
프로파일 링이 QVector
. 연속 할당이 중요 할 것으로 예상하는 경우 [읽기 : a T[]
대신 a를 예상하는 코드와 인터페이싱하고 QList<T>
있으며 이는 QVector
바로 시작하는 이유가 될 수 있습니다 .
일반적으로 컨테이너에 대해 질문하고 QT 문서를 참조로 사용했다면 위의 정보는 유용하지 않습니다.
은 std::vector
크기를 조정할 수있는 배열입니다. 모든 요소는 나란히 저장되며 개별 요소에 빠르게 액세스 할 수 있습니다. 단점은 삽입이 한쪽 끝에서만 효율적이라는 것입니다. 중간이나 시작 부분에 무언가를 놓으면 공간을 만들기 위해 다른 개체를 복사해야합니다. big-oh 표기법에서 끝에 삽입은 O (1), 다른 곳에 삽입은 O (N), 랜덤 액세스는 O (1)입니다.
An std::deque
은 비슷하지만 객체가 나란히 저장된다는 보장은 없으며 양쪽 끝의 삽입이 O (1)이되도록합니다. 또한 한 번에 더 작은 메모리 청크를 할당해야하는데, 이는 때때로 중요 할 수 있습니다. 임의 액세스는 O (1)이고 중간 삽입은 O (N) vector
입니다. 공간적 지역 성은보다 나쁘지만 std::vector
개체가 클러스터되는 경향이 있으므로 몇 가지 이점을 얻을 수 있습니다.
An std::list
은 연결된 목록입니다. 세 가지 표준 순차 컨테이너의 메모리 오버 헤드가 가장 많이 필요하지만 삽입해야 할 위치를 미리 알고 있다면 어디든 빠르게 삽입 할 수 있습니다. 개별 요소에 대한 임의 액세스를 제공하지 않으므로 O (N)에서 반복해야합니다. 그러나 일단 거기에 실제 삽입은 O (1)입니다. 가장 큰 이점 std::list
은 빠르게 연결할 수 있다는 것입니다. 전체 값 범위를 다른 값으로 이동 std::list
하면 전체 작업이 O (1)입니다. 또한 때때로 중요 할 수있는 목록에 대한 참조를 무효화하는 것이 훨씬 더 어렵습니다.
일반적 으로 원시 배열이 필요한 라이브러리에 데이터를 전달할 수 있어야하는 경우가 아니면를 선호 std::deque
합니다 std::vector
. std::vector
연속적으로 보장되므로이 &v[0]
목적을 위해 작동합니다. 마지막으로를 사용했던 때가 기억 나지 std::list
않지만 유효하게 남아있는 참조에 대해 더 강력한 구아 레티가 필요했기 때문에 거의 확실했습니다.