hash_map 관련 질문
글쓴이: rasungboy / 작성시간: 수, 2004/10/20 - 7:08오후
안녕하세요.
윈도우에서 짠 소스를 리눅스로 포팅중 hash_map 에서 막혔습니다.
일단 hash_map 은 네임스페이스가 __gnu_cxx 로 되었더군요.
그래서 일단 네임스페이스 문제는 해결했는데
문제는 vc++ 에서 잘 동작하던 제가 만든 string 대용 클래스가 키값으로
컴파일 되지 않는것이였습니다. 혹시나해서 std::string 을 키값으로
써보았는데도 안되더군요.(컴파일에러가 납니다)
간단한 테스트 코드는 아래와 같습니다.
__gnu_cxx::hash_map<std::string, int> map; std::pair< std::string, int> item( "aaa",2 ); map.insert( item );
일단 키값을 int 형으로 줘보면 잘 동작합니다.(hash_map<int,int>)
이거 봐서는 네임스페이스 문제는 아닌것 같으면서도 그렇고...
__gnu_cxx 네임스페이스를 안쓰고 std를 쓰면서 hash_map 을 선언
하는 방법도 알고싶습니다...
여러분들의 참고말씀 기달리겠습니다.
Forums:
이거 상당히 골치 아픈 문제입니다. 아시겠지만 hash_map과 hash
이거 상당히 골치 아픈 문제입니다. 아시겠지만 hash_map과 hash_set은 표준이 아닙니다.
STL의 기반이 되는 SGI 라이브러리에는 있었기 때문에 VC++이나 gcc에 있긴 하지만 이름만 같지
다른 클래스라고 보는 게 옳습니다. VC++에서도 std가 아닌 stdext namespace에
들어 있지요. (.NET에서는 그렇습니다.) namespace 문제야 꽁수긴 하지만 다음과 같이 하면
간단히 해결됩니다.
문제는 인터페이스인데 이것은 별로 뾰족한 수가 없습니다. 저도 예전에 비슷한 일을 겪었는데
그때는 gcc에 맞춘 코드를 VC++로 포팅하려고 했죠. 결국 포기하고 stlport를 썼습니다.
즉 gcc의 hash_map을 써서 코드를 작성하고 VC++을 쓸 때는 stlport의 STL을 사용했죠.
다행히 gcc와 stlport는 공통적으로 SGI를 기반으로 하기 때문에 큰 어려움은 없었습니다.
조건부 컴파일로 namespace와 헤더만 적당히 맞춰주면 됐거든요. 지금은 반대의 경우로군요.
이런 경우는 저도 경험이 없어서 뭔가 도움이 되기는 힘들겠네요. 아무튼 잘 되기를 바랍니다.
저는 hash_set 사용하는데 std::string 에서 걸리더군요.
저는 hash_set 사용하는데 std::string 에서 걸리더군요.
char *를 쓰느냐 고민하고 있던 차에 검색을 해보니
아마도 std::string 용으로 적당한 해쉬 함수가 없는 듯 합니다.
그래서 std::string 용 해쉬 함수를 적당히 가져다가 쓰니
그런대로 동작은 하는 듯 싶습니다.
를 해쉬함수로 쓰고 정의 할때
식으로 썼습니다.
hash_map 이니
식으로 하면 될 듯 싶습니다. 테스트는 못해봤습니다.
댓글 달기