2012-01-07 1 views
2

두 구현에서 컨테이너에는 node_type의 원시 배열이 저장되며 기본적으로 유형이 T 인 단순 연결 목록입니다.EASTL 및 SGI Hashtable 구현

// From SGI 
template <class _Val> 
struct _Hashtable_node 
{ 
    _Hashtable_node* _M_next; 
    _Val _M_val; 
}; 

나는 교육 이유로 내 자신의 버전을 구현하고 그들이 버킷에 대한 std::list<> 컨테이너를 사용하지 않는 이유 궁금? std::list<>에 이미 존재하는 코드를 작성하는 이유는 무엇입니까?

나는 이것을 발견 한 이유 중 하나가 std::list<>이 이중으로 연결되어있어 낭비되는 부분이 있다는 것입니다. 하지만 하나의 링크 된 목록을 사용한다면 어떨까요? 왜 bucket_type 템플릿 매개 변수를 변경하지 않아도됩니까?

+0

전적으로 구현에 맞습니까? 이렇게하면 라이브러리 구성 요소를 가능한 한 독립적으로 유지할 수 있습니다. 전체'list' 인터페이스가 필요 없기 때문에 몇 가지 필수 목록 작업을 정의하는 것이 훨씬 편합니다. –

+0

@KerrekSB : 같은 양의 공간을 사용하면 (단일 연결 목록 또는'std :: array'가 사용된다고 가정하면) 어떻게 더 희박합니까? 실제로 코드 재사용에 대해 우리가 일반적으로 배우는 것에 반하는 것이 아닙니까? 언급 된 구현은 목록 클래스의 일부를 다시 작성했는데 특히'list <> '가 바뀌면 길을 더 빨리 그리고 더 잘 수행 할 수 있고'hashtable'는 도움이되지 않는다 그것에서. – Samaursa

+0

번역 단위에서 해시 테이블 클래스 만 사용하는 경우 다른 컨테이너 헤더 전체를 가져 오는 것보다 코드를 적게 컴파일해야한다는 점에서 더 편합니다. EASTL을 위해 할당 자 사용을 라이브러리 관리자에게 더 투명하게 만들 것이라고 가정합니다. –

답변

2

이 구현의 버킷리스트 클래스 [템플릿]을 사용하여 하지 이유는 그들이 단일 연결리스트를 가지고 있지 않았고 std::list<T>이 이중으로 연결되어 있다는 것입니다 : 측면에서 불필요한 다시 포인터의 추가 비용 실행 시간과 크기가 나쁜 것으로 간주됩니다. C++ 2011은 이제 std::forward_list<T>을 사용하고 있습니다. 해시 된 컨테이너에서. 이것은 질문을 제기 할 수 있습니다. 왜 그들은 단일 링크 목록을 추가하지 않았습니까? 이것에 대한 대답은 또한 간단합니다 : 단일 연결 목록은 표준의 컨테이너 요구 사항을 따를 수 없으며 나중에 적절한 선택을하도록 남겨졌습니다.

+0

"단일 링크 된 목록은 표준의 컨테이너 요구 사항을 따를 수 없습니다"라는 요구 사항을 충족시킬 수 없음을 명확히 할 수 있습니까? –

+0

@JaredKrumsie :'forward_list'의 인터페이스를보고 차이점을 확인하십시오. 모든 before_begin 헛소리와 같은 것들이 있습니다. 일반적인 반복자 논리는 단일 연결 목록에서는 작동하지 않습니다. –

+1

@ JaredKrumsie : 컨테이너 요구 사항은 예를 들어 erase (iterator)는 iterator가 가리키는 요소를 컨테이너에서 지 웁니다. 이렇게하기 위해 반복자는 이전 요소를 가리킬 필요가 있습니다. 그러나 이것이 설정된 경우 연속 요소에 두 개의 반복자를 사용하여 첫 번째 제거 할 수 있습니다. 이는 반복기를 노드 기반 컨테이너에서 제거되지 않는 요소로 무효화합니다. 그러므로 std :: forward_list는 어떤 형태로 벗어나야 할 필요가 있었다. (아마도 내 뇌에 의해 더 많은 이유가 튀어 나온 것 같다.) –