목록은 pushing_back 일 때 메모리를 할당하는 데 대부분의 시간을 소비합니다. 반면에 벡터는 크기 조정이 필요할 때 요소를 복사해야합니다. 따라서 어떤 컨테이너가 인접 목록을 저장하는 데 가장 효율적입니까?STL vector vs list : 그래프 인접 목록에서 가장 효율적입니까?
답변
나는 이것이 절대 확실성으로 대답 할 수 있다고 생각하지 않습니다. 그럼에도 불구하고, 나는 벡터가 더 잘할 확률은 90 % 이상이라고 추정 할 수 있습니다. 인접 목록은 인접 목록의 요소 순서가 (일반적으로) 중요하지 않기 때문에 사실 많은 벡터보다 많은 벡터를 선호합니다. 즉, 요소를 추가 할 때는 일반적으로 컨테이너의 끝까지, 요소를 삭제하면 컨테이너의 끝으로 바꿀 수 있으므로 끝에 추가하거나 삭제할 수 있습니다.
그렇습니다. 벡터는 요소가 확장 될 때 요소를 복사해야하지만 실제로는 거의 문제가되지 않습니다. 특히 벡터의 지수 증가율은 요소가 복사되는 평균 횟수가 상수로 향하는 경향이 있다는 것을 의미합니다. 일반적인 구현에서 상수는 약 3입니다.
정직하게 복사하는 것이 실질적인 문제입니다 (예 : 복사 요소가 극도로 비쌉니다). 벡터 이후의 다음 선택은 여전히 목록이 아닙니다. 대신 std :: deque 대신에 std :: deque를 사용하는 것이 좋습니다. 이것은 기본적으로 객체 블록에 대한 포인터의 벡터입니다. 드물게 확장을하기 위해 무엇인가를 복사해야하는 경우는 드물지만 드물지만 복사해야하는 것은 객체가 아니라 포인터입니다. 양 끝점의 다른 고유 한 기능 (양쪽 끝에서 일정 시간에 삽입/삭제)이 필요하지 않은 경우 일반적으로 벡터가 더 나은 선택이지만 이케스는 거의 항상 목록보다 더 나은 선택입니다 (즉 벡터는 일반적으로 첫 번째 선택, 상당히 가까운 두 번째, 그리고 꽤 먼 마지막 목록) deque.
답변은 유스 케이스에 따라 다릅니다. 오후 8시 30 분 P.S. @quasiverse - 암시 적으로 또는 명시 적으로 ":: reserve"하는 메모리가 만기 될 때 벡터가 realloc을 호출합니다.
지속적으로 변경되는 인접성 목록 (삽입 및 삭제)이있는 경우 목록이 가장 적합합니다. 다소 정적 인 인접성 목록이 있고 트래버스/룩업을 수행하는 대부분의 경우 벡터가 최상의 성능을 제공합니다.
STL 컨테이너는 고정적으로 정의되지 않으므로 구현이 다릅니다. 조심하다면 코드를 작성하여 벡터 또는 사용중인 목록인지 여부를 신경 쓰지 않아도되고 더 빠르게 볼 수 있도록 시도 할 수 있습니다. 캐시 효과 등의 복잡성을 감안할 때 어떤 정확도로 상대 속도를 예측하는 것은 거의 불가능합니다.
이 비교에 세 번째 옵션 인 특수 할당자를 사용하여 목록을 추가 할 수 있습니다.
고정 크기의 작은 개체에 할당자를 사용하면 할당/할당 해제 속도가 크게 향상 될 수 있습니다 ...
- 1. 2d STL vector typeid
- 2. 인접 행렬에서 그래프 그리기
- 3. 인접 목록 구현 그래프
- 4. stl vector :: Windows와 Linux의 차이점을 삽입 하시겠습니까?
- 5. 인접 목록 그래프 구현 c (모든 라이브러리)
- 6. STL 벡터 스토리지가 항상 인접 해 있다고 가정하는 것이 안전합니까?
- 7. STL 마이그레이션 문제 (VS 2003 -> 2005)
- 8. DefaultModelBinder : IList vs List
- 9. MongoDb Index/List 목록에서 찾기
- 10. SQLite는 12 번째 레코드를 얻습니다 - 가장 효율적입니까?
- 11. C에서 STL (vector, map ...)과 같은 라이브러리는 무엇입니까?
- 12. stl vector 및 C++ : 기본 생성자없이 .resize하는 방법?
- 13. 그래프 이동 Vs 트리 탐색
- 14. 프롤로그의 인접 매트릭스
- 15. 템플릿 및 STL 컨테이너
- 16. STL 벡터와 함께 STL 할당 자 사용
- 17. 어떤 태그 스키마가 가장 효과적입니까/효율적입니까?
- 18. 어떤 서버 쪽이 소켓에서 가장 효율적입니까?
- 19. 비교 가능한 Vs TreeSet 목록 List
- 20. 이분 그래프의 분할 인접 행렬
- 21. 주문 STL
- 22. not2를 사용할 때 struct vs STL functor로 클래스
- 23. iPhone 3 v 4 v iPad ui. Raster vs vector
- 24. STL 컨테이너의 범위 기반
- 25. std :: vector 중간에 요소를 삽입하는 가장 쉬운 방법은 무엇입니까
- 26. STL 컨테이너의 지속 참조
- 27. VS 2010 Ultimate과 유사한 종속성 그래프?
- 28. 목록에서 가장 빠른 항목을 선택하십시오.
- 29. 목록에서 항목을 찾는 가장 빠른 방법은 무엇입니까?
- 30. 벡터를 복제하는 STL
누가 벡터에서 복사본을 만들겠습니까? – quasiverse
@quasiverse :'vector'에 대한 요구 사항은 본질적으로 커지면서 복사를 요구합니다. '벡터'는 요소를 연속적으로 저장해야합니다. 요소를 추가하면 할당 된 공간을 결국 사용하게되고 다음 번에 새로운 공간 할당을 얻고 현재 요소를 새 공간에 복사 한 다음 이전 공간을 할당 해제합니다 . –