std :: set가 메모리에 연속적으로 객체를 저장합니까?


16

? std::set같은 연속 메모리에 객체를 저장 합니까 std::vector?

웹에서 이것을 찾을 수 없었습니다 .cppreference는 메모리 할당에 대한 세부 사항을 언급하지 않습니다. 그러나 왜 연속 메모리를 사용할 수 없었는지 알 수 없으므로 내 질문입니다.


5
읽기 set::insert요구 사항 : en.cppreference.com/w/cpp/container/set/insert "... 반복자 또는 참조가 무효화 되지 않습니다 ...." 이므로 확장처럼 필요할 때 재 할당 할 수 없습니다 std::vector.
Richard Critten

성능 : 당신은 당신의 사용의 경우를 참조하십시오 (당신의 해시 기능에 따라 다름) 측정 할 필요가 channel9.msdn.com/Events/Build/2014/2-661을 에서 45:48
리처드 Critten

4
boost :: flat_set 도 참조하십시오 .
Caleth

1
"세트가 반복되거나 객체가 연속 메모리 위치에 저장 됨"또는 "모든 객체가 하나의 큰 메모리 덩어리에 저장되지만 (임의의 순서로)"와 같은 '연속적'을 의미합니까?
Pablo H

1
일반적으로 "컨테이너 A는 컨테이너 B와 동일합니다"라고 묻는 경우 대답은 "아니오"입니다. 그렇지 않으면 컨테이너 A 만있을 것입니다 (컨테이너 B를 갖는 목적은 무엇입니까?). 이것은 물론 컨테이너 어댑터 에는 적용되지 않지만 std::set여기서 중요한 것은 그중 하나가 아닙니다.
궤도

답변:


25

std :: set가 std :: vector와 같은 연속 메모리에 객체를 저장합니까?

그럴 것이라는 보장은 없습니다. 또한 실제로는 컨테이너 요구 사항으로 인해 불가능합니다. 따라서 아니오, 연속 메모리에 오브젝트를 저장하지 않습니다.

연속 메모리를 사용할 수없는 이유를 볼 수 없습니다

세트의 요소에 대한 참조는 삭제와 함께 삽입시 삭제 된 요소에 대한 제외를 제외하고는 유효해야합니다. 이 요구 사항은 연속 메모리와 호환되지 않습니다.

내가 아는 한, 균형 검색 트리는 구현할 수있는 유일한 데이터 구조입니다 std::set.


OP가 의미하는 경우 큰 연속 된 덩어리에서 트리 노드를위한 공간을 만들 수 있습니다. (그러나 inplace realloc이 실패하거나 할당자가 해당 realloc을 지원하지 않는 경우 반복자 무효화는 insert모든 노드를 새로운 큰 블록으로 복사하여 하나의 블록 으로 만 제한 하지 않습니다.)
Peter 코드

15

특정 제약 조건으로 std::set인해 연속 메모리를 사용할 수는 없지만 명시 적으로 제외되지는 않습니다 .

예를 들어, set::insert로그 복잡도는 있지만 vector::insert항목을 섞기 위해서는 선형 복잡성이 필요합니다. 또한 set::insert반복자를 무효화하지 않습니다. 연속적인 메모리로는 두 가지 요구 사항을 모두 실현할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.