2014-04-09 6 views
1

나는 내 코드에서 C++ 컨테이너 객체를 사용하고 루프를 사용하여 각 요소를 읽는 함수가있다. 이 함수는 다음과 같이 보입니다.std :: unordered_set와 std :: vector 사이의 다형성?

void function(std::unordered_set<unsigned int> container) 
{ 
    for(auto it = container.begin(); it != container.end(); it++) 
    { 
     /* Do something */ 
    } 
} 

그러나이 함수는 std :: vector 유형의 컨테이너도 허용하고 싶습니다. 코드에서 알 수 있듯이 함수 본문은 컨테이너 유형을 인식 할 필요는 없습니다 (* it을 사용하여 각 요소에 액세스 할 수 있습니다). 코드에서 중복성을 사용하지 않고 어떻게이 작업을 수행 할 수 있습니까?

답변

3

뭔가 :

template<typename ContainerType> 
void function(ContainterType container) 
{ 
    ... 
} 

당신이 원하는 것을해야한다.

STL 컨테이너에 대한 공통 기본 클래스가 없으므로 템플리트가 필요합니다. 따라서이 템플릿은 "이 클래스가 기본 클래스이므로 임의의 파생 된 유형을 가져옵니다"라는 것이 허용되지 않습니다.

당신이 컨테이너를 수정하지 않는 가정 할 때, 나는 함께 가고 싶어요 :

template<typename ContainerType> 
void function(const ContainterType& container) 
{ 
    ... 
} 

만든 사본을 피하기 위해.

2

성능상의 이유로 더 다차원을 염두에두고 설계된 세계 또는 STL 컨테이너가 아닌 "일반 프로그래밍"(OOP와 반대) 관점에서 볼 때; 대신 STL 알고리즘처럼 일반 반복기 기반 인터페이스를 노출하고 주어진 반복자 유형으로 작업해야합니다. 같은

+0

+1. 좀 더 명시 적으로, ala'function (container.begin(), container.end()) '라 불리는'template void 함수 (Iterator begin, Iterator end)'는 또한 예를 들어. 배열 요소에 대한 포인터, 입력 반복자 등. –