2012-09-30 40 views
3

我正在用數據成員編寫我自己的矢量類Vector:T * array,size_t vector_size和size_t容量。我想創建一個sort()方法:爲矢量類寫一個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型,焦炭等,但它工作得很好,當我試圖解決一個向量由向量元素的它贏得了」編譯。 從我讀我需要定義以某種方式<運營商,但我真的不知道該怎麼做......

我曾嘗試:

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」語法需要'>>'之間的空格來區分右移運算符:'Vector >' – leemes

+0

...但是如果您需要C++ 11支持,請使用lambdas作爲比較! ;)http://stackoverflow.com/q/7767998/592323 – leemes

回答

3

您提供了一個具有錯誤簽名的比較方法。你需要接受一個const引用或值,但不能(可修改)引用你的類型,而前者應該是首選的,除非它是基本類型。所以,你的比較方法的簽名應該是這樣的:

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

這是因爲std::sort(和很多其他的方法)是設計成不修改內容。如果它們取值(但對於大型類型來說這會很慢)或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,交換向量並不是什麼大問題,因爲交換移動它們而不是複製它們。 –