STL에서의 벡터 대 리스트
나는 Effective STL에 주목했다.
vector는 기본적으로 사용해야 하는 시퀀스 유형입니다.
능률을 한 것 요.vector
뭐든지 할 수 있어요
'이'가 '어느 쪽인가'라는 해 주실 수 요?vector
" " " " 입니다.list
용해야? ??
표준:: 개요 | 표준:: 목록 |
---|---|
연속 메모리 | 비연속 메모리 |
미래 요소를 위해 공간을 미리 할당하므로 요소 자체에 필요한 공간보다 더 많은 공간이 필요합니다. | 사전 할당된 메모리가 없습니다.목록 자체의 메모리 오버헤드는 일정합니다. |
각 요소에는 요소 유형 자체의 공간만 필요합니다(추가 포인터 없음). | 각 요소에는 목록의 다음 요소 및 이전 요소에 대한 포인터를 포함하여 요소를 유지하는 노드의 추가 공간이 필요합니다. |
요소를 추가할 때마다 벡터 전체에 메모리를 재할당할 수 있습니다. | 요소를 추가했다고 해서 목록 전체에 메모리를 재할당할 필요는 없습니다. |
마지막에 삽입하는 것은 상각된 일정한 시간이지만, 다른 곳에 삽입하는 것은 비용이 많이 드는 O(n)입니다. | 삽입 및 삭제는 목록의 어디에 발생하든 비용이 적게 듭니다. |
벡터 끝의 소거는 상수 시간이지만, 나머지 부분에서는 O(n)입니다. | 목록을 스플라이싱과 결합하는 것은 저렴하다. |
해당 요소에 임의로 액세스할 수 있습니다. | 요소에 랜덤으로 액세스 할 수 없기 때문에, 리스트내의 특정의 요소를 취득하는 것은 비용이 많이 드는 경우가 있습니다. |
벡터에 요소를 추가하거나 벡터에서 요소를 제거하면 반복기가 비활성화됩니다. | 반복기는 목록에서 요소를 추가하거나 제거하더라도 유효합니다. |
요소 배열이 필요한 경우 기본 어레이를 쉽게 사용할 수 있습니다. | 기본 배열이 없으므로 요소 배열을 새로 생성하여 모두 추가해야 합니다. |
일반적으로 어떤 유형의 순차 컨테이너를 사용하는지 상관하지 않을 때는 벡터를 사용합니다. 그러나 컨테이너의 끝 이외의 장소에 여러 번 삽입하거나 삭제할 경우에는 목록을 사용해야 합니다.랜덤 액세스가 필요한 경우 리스트가 아닌 벡터가 필요합니다.그 밖에도 어플리케이션에 따라 어느 한쪽이 필요한 경우도 있습니다만, 일반적으로는 좋은 가이드라인입니다.
시퀀스의 끝 이외의 장소에 많은 항목을 반복해서 삽입하는 상황.
각 컨테이너 유형에 대한 복잡성 보장을 확인하십시오.
요소를 자주 삽입할 필요가 없는 경우 벡터가 더 효율적입니다.목록보다 CPU 캐시 인접성이 훨씬 우수합니다.즉, 한 요소에 액세스하면 다음 요소가 캐시에 존재하며 느린 RAM을 읽을 필요 없이 검색할 수 있습니다.
대부분의 답변에는 중요한 세부 정보가 누락되어 있습니다. 그 이유는 무엇입니까?
컨테이너에 무엇을 보관하시겠습니까?
「 」의 int
그 다음에 ""std::list
모든 시나리오에서 손실됩니다.재할당 가능 여부, 전면 삭제 등입니다.목록은 이동 속도가 느립니다. 삽입할 때마다 할당자와의 상호 작용이 필요합니다.가 굉장히 .list<int>
vector<int>
고 . . . . . . . . . 。deque<int>
목록을 사용하는 것만으로 메모리 오버헤드가 커지는 것이 아니라 더 좋을 수도 있고 더 가까울 수도 있습니다.
크고 흉한 하는 것은, 「다」, 「다」, 「다행 「다만」, 「」, 「」, 「다만」, 「다만」가 도 모릅니다.그러면, 데이터 블록에 액세스 하는 것이 좋을지도 모릅니다.list<UglyBlob>
vector<UglyBlob>
.
「」로 는,vector<UglyBlob*>
또는 심지어vector<shared_ptr<UglyBlob> >
- , 하다 - 하다, 하다
따라서 액세스 패턴, 타깃 요소 수 등은 비교에 영향을 미치지만, 제 견해로는 요소 크기, 복사 비용 등이 영향을 미칩니다.
말하면...
C++의를 선택하는 것이 는 이 to ++를 사용합니다.
벡터-
- 벡터는 전염성 기억을 기반으로 한다
- 벡터는 작은 데이터 세트를 위한 수단입니다.
- 데이터 세트를 통과하는 동안 가장 빠른 성능을 발휘하는 벡터
- 벡터 삽입 삭제는 큰 데이터 세트에서는 느리지만 매우 작은 데이터 세트에서는 빠릅니다.
리스트-
- 리스트는 히프메모리를 기반으로 합니다.
- 리스트는 매우 큰 데이터 세트를 얻기 위한 수단입니다.
- 리스트는 작은 데이터 세트를 통과할 때는 비교적 느리지만 큰 데이터 세트에서는 빠르다.
- 목록 삽입 삭제는 큰 데이터 집합에서는 빠르지만 작은 데이터 집합에서는 느리다
std::list의 특별한 기능 중 하나는 스플라이싱(목록의 일부 또는 전체를 다른 목록으로 링크 또는 이동)입니다.
컨텐츠의 카피 비용이 매우 높은 경우도 있습니다.이 경우 컬렉션을 목록으로 정렬하는 것이 더 저렴할 수 있습니다.
또한 컬렉션이 작을 경우(또, 컨텐츠의 카피가 특별히 비싸지 않은 경우), 임의의 장소에 삽입해 삭제해도, 벡터가 리스트를 웃돌 가능성이 있습니다.리스트는 각 노드를 개별적으로 할당하기 때문에 몇 개의 단순한 개체를 이동하는 것보다 비용이 많이 들 수 있습니다.
그렇게 어려운 규칙은 없는 것 같아.이것은 컨테이너로 가장 많이 하고 싶은 것뿐만 아니라 컨테이너의 크기 및 포함된 유형에 따라 달라집니다.벡터는 일반적으로 목록보다 우선합니다. 왜냐하면 벡터의 콘텐츠를 단일 연속 블록으로 할당하기 때문입니다(기본적으로 동적으로 할당된 배열이며 대부분의 경우 배열이 여러 항목을 유지하는 가장 효율적인 방법입니다).
우리 반 학생들은 벡터를 사용하는 것이 언제 더 효과적인지 설명하지 못하는 것처럼 보이지만, 목록을 사용하라고 조언할 때는 매우 행복해 보입니다.
나는 이렇게 이해한다.
목록: 각 항목에는 다음 요소 또는 이전 요소의 주소가 포함되어 있기 때문에 이 기능을 사용하면 정렬되지 않더라도 항목을 랜덤화할 수 있습니다.순서는 변경되지 않습니다.메모리가 fragment화 되어 있는 경우 효율적입니다.하지만 다른 큰 장점도 있습니다. 아이템을 쉽게 삽입/삭제할 수 있습니다. 왜냐하면 포인터를 변경하기만 하면 되기 때문입니다.결점:임의의 단일 항목을 읽으려면 올바른 주소를 찾을 때까지 한 항목에서 다른 항목으로 이동해야 합니다.
벡터:벡터를 사용하는 경우, 메모리는 일반 배열과 같이 훨씬 더 체계화됩니다. 즉, 각 n번째 항목은 (n-1)번째 항목 바로 뒤에, 그리고 (n+1)번째 항목 앞에 저장됩니다.왜 목록보다 나은가?고속 랜덤 액세스를 가능하게 하기 때문입니다.예를 들어 벡터 내의 아이템의 크기를 알고 있고, 그것들이 메모리에 연속되어 있다면 n번째 아이템이 어디에 있는지 쉽게 예측할 수 있습니다.목록의 모든 아이템을 탐색하여 원하는 아이템을 읽을 필요가 없습니다.벡터를 사용하여 직접 읽을 수 없는 리스트가 있습니다.한편, 벡터 배열을 수정하거나 값을 변경하는 것이 훨씬 느립니다.
목록은 메모리에서 추가/삭제할 수 있는 개체를 추적하는 데 더 적합합니다.벡터는 다수의 단일 항목에서 요소에 액세스하려는 경우에 더 적합합니다.
리스트가 어떻게 최적화되어 있는지는 모르겠지만 고속 읽기 액세스를 원하는 경우 벡터를 사용해야 합니다.STL 고정 리스트가 얼마나 좋은지 읽기 액세스에서는 벡터만큼 빠르지 않기 때문입니다.
반복기를 비활성화할 수 없습니다.
기본적으로 벡터는 자동 메모리 관리 기능이 있는 어레이입니다.데이터는 메모리에서 연속됩니다.중간에 데이터를 삽입하려고 하면 비용이 많이 듭니다.
리스트에서 데이터는 관련 없는 메모리 위치에 저장됩니다.중간에 삽입하는 것은 새 데이터를 위한 공간을 확보하기 위해 일부 데이터를 복사하는 것이 아닙니다.
질문에 더 구체적으로 답변하기 위해 이 페이지를 인용하겠습니다.
벡터는 일반적으로 요소에 액세스하고 시퀀스 끝에서 요소를 추가하거나 제거하는 데 가장 효율적입니다.끝 이외의 위치에 요소를 삽입하거나 제거하는 작업의 경우 설계 및 목록보다 성능이 떨어지고 목록보다 반복자 및 참조가 일관성이 떨어집니다.
시퀀스 중간에 많은 삽입 또는 삭제가 있는 경우(예: 메모리 관리자).
빠른 참조를 위해 표에 답변을 요약합니다.
벡터 | 목록. | |
---|---|---|
접근 | 빠른 | 느리다 |
삽입/삭제 조작 | 느리다 | 빠른 |
메모리 할당 | 연속적인 | 비연속 |
크기 사전 할당 | 예약 필요 | 예약 불필요 |
요소당 필요한 공간 | 요소 자체에 대해서만 | 및 : 요소 ('전위 요소') |
벡터와 리스트의 경우, 나에게 눈에 띄는 주된 차이는 다음과 같다.
벡터
벡터는 요소를 연속 메모리에 저장합니다.따라서 벡터 내에서 랜덤 액세스가 가능하며, 이는 벡터의 요소에 접근하는 것이 매우 빠르다는 것을 의미합니다. 왜냐하면 우리는 단순히 기본 주소와 항목 인덱스를 곱하여 해당 요소에 액세스할 수 있기 때문입니다.실제로 이 목적을 위해서는 O(1) 또는 일정한 시간만 소요됩니다.
벡터는 기본적으로 어레이를 랩하기 때문에 요소를 벡터(동적 어레이)에 삽입할 때마다 새로운 요소를 수용하기 위해 연속된 새로운 메모리 블록을 찾아 크기를 조정해야 합니다.이것에 의해서, 시간이 걸립니다.
다른 요소에 대한 포인터를 저장하기 위해 메모리를 추가로 사용하지 않습니다.
목록.
목록은 해당 요소를 비연속 메모리에 저장합니다.따라서 리스트 내에서는 랜덤접근은 불가능합니다.즉, 그 요소에 액세스하려면 포인터를 사용하여 벡터에 비해 느린 리스트를 통과해야 합니다.여기에는 O(1)보다 느린 O(n) 또는 선형 시간이 걸립니다.
리스트는 연속되지 않은 메모리를 사용하기 때문에 메모리 재할당이 회피되기 때문에 리스트 내에 요소를 삽입하는 데 걸리는 시간이 벡터의 경우보다 훨씬 효율적입니다.
특정 요소의 전후로 요소에 대한 포인터를 저장하기 위해 추가 메모리를 사용합니다.
따라서 이러한 차이를 염두에 두고 메모리, 빈번한 랜덤 액세스 및 삽입을 고려하여 주어진 시나리오에서 벡터 대 리스트의 승자를 결정합니다.
반복자의 유효성을 유지하는 것도 리스트를 사용하는 이유 중 하나입니다.다른 하나는 항목을 푸시할 때 벡터가 재할당되지 않도록 하는 것입니다.이것은 reserve()를 인텔리전트하게 사용함으로써 관리할 수 있지만, 경우에 따라서는 단순히 목록을 사용하는 것이 더 쉬울 수도 있고 더 실현 가능성이 있습니다.
때는, 「」를 사용할 수 .list::splice
.
예를 들어 그래프 분할 알고리즘은 증가하는 컨테이너 간에 재귀적으로 분할되는 객체의 수를 일정하게 가질 수 있습니다.개체는 한 번 초기화해야 하며 항상 메모리의 동일한 위치에 있어야 합니다.재할당보다 재링크하여 재배열하는 것이 훨씬 빠릅니다.
편집: 라이브러리가 C++0x의 구현을 준비함에 따라 목록으로 연속되는 일반적인 사례가 시퀀스의 길이에 따라 선형적으로 복잡해지고 있습니다.그 이유는splice
은 그 (은 그 목록을 단순히 계산하고 다시 연결하는 것은 여전히 다른 어떤 대안보다 빠릅니다. 전체 목록 또는 단일 요소를 스플라이싱하는 것은 항상 복잡한 특수한 경우입니다.하지만, 접합해야 할 긴 시퀀스가 있다면, 더 좋고, 구식이고, 비준수 용기를 찾아 헤매야 할 수도 있습니다.
유일하게 어려운 규칙은list
must use는 컨테이너 요소에 포인터를 배포해야 하는 곳입니다.
와는 달리vector
요소의 메모리는 재할당되지 않습니다.가능하면 사용하지 않는 메모리에 대한 포인터가 있을 수 있습니다.이것은 기껏해야 no-no이고, 최악의 경우 no-no입니다.SEGFAULT
.
으로는 a)vector
*_ptr
, 에뮬레이트, 에뮬레이트, 에뮬레이트, 에뮬레이트, 에뮬레이트, 에뮬레이트, 에뮬레이트, 에뮬레이트, 에뮬레이트, 에뮬레이트 등입니다.list
의미론일 뿐입니다.)
은 용기 할 때 수 있는 이 있습니다.그 결과, 용기의 에 요소를 삽입할 수 있습니다.list
더 좋을 것 같습니다.
리스트는 stl의 double-LinkedList의 래퍼일 뿐이므로 d-linklist에서 기대할 수 있는 기능, 즉 O(1) 삽입 및 삭제 기능을 제공합니다.벡터는 동적 배열처럼 작동하는 전염성 데이터 시퀀스입니다.추신 - 더 쉽게 이동할 수 있습니다.
List는 Double Linked List이므로 요소를 쉽게 삽입하고 삭제할 수 있습니다.포인터 몇 개만 바꾸면 됩니다.벡터에서는 요소를 중간에 삽입하려면 각 요소가 한 인덱스씩 이동해야 합니다.또한 벡터의 크기가 가득 차면 먼저 크기를 늘려야 합니다.그래서 비용이 많이 드는 수술입니다.따라서 삽입 및 삭제 작업을 더 자주 수행해야 하는 경우에는 이러한 사례 목록을 사용해야 합니다.
언급URL : https://stackoverflow.com/questions/2209224/vector-vs-list-in-stl
'programing' 카테고리의 다른 글
파일을 WPF로 드래그 앤 드롭 (0) | 2023.04.15 |
---|---|
데이터베이스에 대한 트랜잭션 로그가 가득 찼습니다. (0) | 2023.04.15 |
엔티티 프레임워크6 트랜잭션롤백 (0) | 2023.04.15 |
어레이를 루프하여 인덱스와 값을 모두 인쇄 (0) | 2023.04.15 |
EPPlus를 사용하여 열 또는 셀을 읽기 전용으로 만듭니다. (0) | 2023.04.15 |