2012-09-30 3 views
3

T * array, size_t vector_size 및 size_t 용량의 데이터 멤버가 포함 된 Vector 클래스를 직접 작성하고 있습니다. 나는 종류를 만들려고하고있다() 메소드 :벡터 클래스의 sort() 메서드 작성

template <class T>                         
void Vector<T>::sort(bool ascending)                     
{                             
    std::sort(array,array+vector_size);                    
    if(ascending==false)                        
     std::reverse(array,array+vector_size);                  
} 

배열의 요소가 int 형, 문자 등으로 있지만 때 잘 작동 나는 '원 벡터 요소로 구성된 벡터를 정렬 할 때 t 컴파일. 나는 어떤 방법으로 < 연산자를 정의해야합니다 읽었습니다,하지만 난 정말 그 방법을 모르는 것과 ...

나는 시도했다 :

template <class T> 
bool Vector<T>::operator<(Vector<T> & source) const 
{ 
    return (vector_size < source.vector_size); 
} 

같은 내 주요보기 이 :

int main() { 
    Vector<int> v1(5,1); 
    Vector<int> v2(7,2); 
    Vector<int> v3(3,3); 
    Vector<Vector<int>> v4; 
    v4 = {v1,v2,v3}; 
    v4.sort(1); 
return 0; 
} 

이 오류 중 하나입니다 내가 얻을 :

/usr/include/c++/4.6/bits/stl_algo.h:2212:4 : 오류 : 운영자'에 대한 어떤 경기'in * * __first < __pivot'

+0

'Vector > '구문은 C++ 11 표준 이후에만 지원되므로 C++ 11이 아닌 컴파일러를 지원하려면이 옵션을 사용하지 않는 것이 좋습니다."old"문법은 오른쪽 shift 연산자와 구별하기 위해'>> '사이에 공백이 필요합니다 : Vector > – leemes

+0

... 그러나 C++ 11 지원이 필요하다면 lambdas를 비교로 사용하십시오! ;) http://stackoverflow.com/q/7767998/592323 – leemes

답변

3

잘못된 서명으로 비교 방법을 제공했습니다. 당신은 const 참조 나 값을 받아 들일 필요가 있습니다 만, 타입에 대한 (수정 가능한) 참조는 아닙니다. 전자는 원시 타입이 아니면 선호해야합니다. 그래서 비교 방법의 서명은 다음과 같아야합니다 std::sort (그리고 다른 방법을 많이가) 내용을 수정하지 않도록 설계 되었기 때문에

template <class T> 
bool Vector<T>::operator<(const Vector<T> & source) const 
{ 
    return (vector_size < source.vector_size); 
} 

이입니다. 이것들이 값을 취하는 경우는 보증됩니다 (다만, 대형의 경우는 느려집니다). 또는 const 참조.

비교 방법을 정의하여 해당 내용이 아닌 벡터의 크기 과 비교하십시오. 모든 벡터의 길이는 같습니다. 따라서 그들은 std::sort에 의해 동등한 대우를받습니다. 따라서 std::sort은 변경되지 않습니다 v4 ... 문자열 비교와 비슷한 방식으로 내용을 비교하려는 경우 (첫 번째 항목이 먼저 계산됩니다. 등가라면 다음 등등 ...) 다음을 사용하십시오.

template <class T> 
bool Vector<T>::operator<(const Vector<T> & source) const 
{ 
    for(int i = 0; i < size && i < source.size; ++i) { 
     if(*this[i] < source[i]) 
      return true; 
     else if(source[i] < *this[i]) 
      return false; 
    } 
    // You have to decide what to do if the length isn't equal. 
    // But if the vectors are really equal than return false: 
    if(size == source.size) 
     return false; 
} 
+0

감사합니다! 그들은 실제로 길이가 다르지만, 5,7 및 3입니다. 그래서 그것은 작동합니다. – Smajjk

1

귀하의 const를 잊었습니다!

template <class T> 
bool Vector<T>::operator<(const Vector<T> & source) const // <- here 
{ 
    return (vector_size < source.vector_size); 
} 
1

당신이 필요로하는 것은 조작자에게 매개 변수로 const을 사용하는 것입니다. 그렇지 않으면 읽기 전용 (일반적으로 발생하는)과 일치 할 수 없습니다.

벡터 벡터를 정렬하면 스왑이 발생할 때마다 전체 벡터 이 복사됩니다. 이것은 특히 효율적이지는 않습니다. 벡터가 개별적으로 저장되고 vector-of-pointer-to-vector와 같은 것을 가지고 있다면 적어도 정렬은 더 빠를 것입니다.

"엄격한 약한 주문"의 정의도 꼭 읽으십시오. 순서가 자체적으로 일관성을 유지하는 것이 중요하거나 std :: sort()와 같은 표준 알고리즘이 잘못 구현 될 수 있습니다 (일부 구현에서는 메모리가 손상 될 수 있음).

+0

이 비교 방법은 일관성이 있습니다, 그렇지 않습니까? – leemes

+0

C++ 11에서는 스왑 벡터가 스왑 벡터를 복사하는 대신 움직이기 때문에 벡터를 스와핑하는 것은 큰 문제가 아닙니다. –