2013-04-17 2 views
0

해시 테이블을 쓰고 있지만 어려움에 직면했습니다.
map <string,int> m(a.begin(),a.end())
다음과 같은 클래스 정의가 있습니다 : template <class key,class val,class hashik=std_hash> class hash_table. 다음과 같은 클래스 정의가 있습니다.
은 내가 생성자 정의 :STL 반복자를 사용하는 템플릿 생성자

template <template <class> class C> hash_table(typename C<pair <key,val> >::iterator first,typename C<pair <key,val> >::iterator last) 
{ 
    init(); 
    for(pair <key,val>* it=first;it!=last;++it) 
     this->operator[](it->first)=it->second; 
} 

를하지만 컴파일되지 않습니다. 통화와 일치하는 기능이 없습니다. 예 :

vector <pair <string,int> > a; 
... 
hash_table <string,int> m(a.begin(),a.end()); //compilation error 

내가 뭘 잘못하고 있니? 그리고 템플릿에 관한 어떤 책을 읽으라고 조언 할 수 있습니까?

+0

다른 사람이 컴파일을 시도 할 수있는 [예제] (http://www.sscce.org/)를 게시 할 수 있습니까? – Praetorian

답변

1

당신은 어떤 유형을 받아들이 느냐에 관해 너무 구체적으로하려고합니다. 기억해야 할 중요한 점은 템플릿이 컴파일되는 한 템플릿은 거의 일치한다는 것입니다. 내가 제대로 코드를 해독하고있어 경우에, 당신은 클래스 다음과 같이 있습니다

template <typename K, typename V> hash_table { /* ... */ }; 

이 유형 K의 키 입력 V의 값으로 해시 테이블을 선언합니다. 이 템플릿은 너무 있도록지도에서 요소를 받아들이는 생성자를 작성하려면 생성자를 선언

template <typename Iter> 
hash_table(Iter first, Iter last) 
{ 
    init(); 
    for (Iter it = first; it != last; ++it) 
     this->operator[](it->first)=it->second; 
} 

이 자동적으로 firstsecond 회원을 얻기 위해 역 참조 할 수있는 모든 반복자를 일치합니다. 표준 컨테이너 중에는 map, multimap 및 그 unordered_ 사촌이 포함됩니다. 그게 너를 시작하게하는데 충분할거야.

또한이 기능은 복잡한 기능 포인터 나 람다 (철자를 사용할 수 없음)와 같이 철자법을 모르는 유형이 필요할 때 유용한 트릭입니다.

+0

감사합니다! 이제 작동합니다! – perlik

관련 문제