2014-11-09 4 views
0

반복자를 함수로 전달할 때 벡터로 작업하기가 더 쉽다고 생각하기 때문에 생성자로 변환하지만 새 벡터가 만들어진 것처럼 보입니다. 따라서 함수에서 변경된 사항은 없습니다. 하지만 나는 변화가 필요하고 새로운 기억을 가지지 않아야합니다.템플릿 함수에 벡터 반복자 전달하기

template <class Element> 
void HeapSort::MaxHeapify(typename vector<Element>::iterator first, typename vector<Element>::iterator last, ...) 
{ 
    vector<Element> array(first, last); 
    ... 
} 

또한 이러한 함수를 호출 할 때 요소의 유형을 명시 적으로 지정해야합니다. 왜?

MaxHeapify<Element>(array.begin(), array.end(), i); 

편집 : 내가 *(first + i) = 5 쓰기 너무 쉽게하고 array[i] = 5로 읽을 것을 의미 쉽게와.

편집 2 : first[i] = 5으로 표시 될 수있는 것으로 보입니다. 누군가 내게 질문의 두 번째 부분을 도울 수 있습니까?

답변

1

함수 안에 새 벡터를 만들 필요가 없습니다. 이터레이터만으로 알고리즘을 수행 할 수 있습니다. 그러나 "더 쉽기"때문에 그렇게하고 싶다면 벡터를 완성한 후에 결과 배열의 값을 매개 변수 범위에 복사해야합니다. 접근 방식에 새로운 메모리를 할당하는 것을 피할 수는 없습니다.

두 번째 질문에 대해서는 컴파일러에서 유형을 추론 할 수 없습니다. 이 같은 템플릿을 선언함으로써이 문제를 해결할 수 :

보너스로
template <class Iter> 
void HeapSort::MaxHeapify(Iter first, Iter last, ...) 

,이 함수는 임의 접근 반복자 모든 종류의 작업을 수행 할 수 있습니다.