2

해시 테이블에 삽입/조회/삭제 인터페이스를 제공해야합니다. 내부 버킷/항목 관리를 제공하기 위해서만 해시 테이블을 작성했습니다. 해시 함수는 외부에서 제공되어야합니다. 이제 해시 테이블이 고정 길이 데이터 형식뿐만 아니라 바이트 배열도 처리 할 수 ​​있도록 인터페이스를 노출하는 방법에 대해 고민하고 있습니다. 문제는 바이트 배열의 경우 해시 함수가 배열 길이를 알아야하는 반면 다른 유형의 경우 해시 함수는 해당 정보없이 수행 할 수 있다는 것입니다. 내 문제는 해시 함수에 두 개의 매개 변수가 필요하기 때문에 바이트 배열에 operator[]을 구현할 수 없다는 것입니다. 그리고 나는 operator[]을 유지하고 싶습니다. 이 주변에 어떤 방법이 있습니까 (T*을 전문으로하지 않고 그 전문 분야에서 operator[]에 대한 컴파일러 오류가 발생하지 않았습니까?)?템플릿 전문화 정보

답변

1

해시 테이블의 연산자 []가 해당 연산자에 저장되어있는 데이터 유형의 연산자 []과 충돌하지 않기 때문에 여기서 혼란스러워합니다.

hash_table에 연산자 []가있는 경우 연산자 []에 키를 제공하는 hash_map이거나 연산자 []가 셀의 내용을 반환 할 수 있습니다.

일반적으로 내 해시 테이블을 구현하는 경우 항목에 데이터를 직접 저장하지 않지만 데이터에는 일부 "메타 데이터"즉 셀 관련 정보가 저장됩니다. 해시 테이블이 삭제를 지원함에 따라 이제는 그와 같은 셀을 찾는 전략이 무엇이든 상관없이 다른 곳으로 옮겨 졌을 것으로 추정되는 충돌에 여전히 도달 할 수 있어야합니다. 따라서 삭제 된 셀은 사용할 수 있지만 점유 된 적이없는 셀과는 다른 의미를 가지며 콜리 전 코스의 경로의 일부일 수 있습니다.

해시 함수는 독립적입니다. 따라서 저장소 메커니즘과 독립적이며 해시 테이블의 operator []를 호출하지 않습니다.

해시 테이블은 해시 함수 및 비교 함수 만 사용하고, 그렇지 않은 경우 자체 저장 정책 및 충돌 처리 정책을 사용합니다.

+0

+1. 해시 테이블에서 키의 바이트 레이아웃을 인식하면 안된다고 생각합니다. 바이트 배열 키에 대한 래퍼 클래스를 구현합니다. – nakiya

0

그래서, 당신의 바이트 배열은 크기가 다양 바이트 배열뿐만 아니라 고정 길이 데이터 유형

를 처리 할 수 ​​있습니다. 각 어딘가의 길이를 기록해야합니다. 값으로 해시 테이블에 값을 저장하려면 객체에 데이터와 길이 값을 패키지화 할 수 있습니다. STL은 std :: vector <> 및 std :: string <을 포함하여 이미 이에 적합한 일부 클래스를 제공합니다. >. 또는 해시 테이블에 바이트 배열에 대한 포인터/참조를 저장하려는 경우 길이를 찾을 위치를 저장하거나 알고 데이터에 대한 포인터/참조가있는 간단한 "핸들"클래스를 만들 수 있습니다.

"CashCow"가 지적했듯이 바이트 배열의 operator[]과 해시 테이블의 고유 한 충돌이 없습니다 ... 필요한 경우 체인으로 연결할 수도 있습니다.