2010-10-29 165 views
3

我試圖編寫模板化的快速排序函數。在我腦海中的想法是,我會寫,可以在具有標運算符和它所包含的對象次序關係的任何數據結構,操作快速排序,所以我可以做這樣的事情模板中的模板 - 從模板類型訪問包含的類型

quicksort<deque<int> >(); 
quicksort<vector<string> >(); 

等。

我開始了一個功能類似

template<typename T> 
void quicksort(T& list); 

我馬上跑進來臨了執行交換操作所必需的排序功能的問題。我需要知道我交換的值是字符串,字符,整數,無論​​如何我可以暫時執行交換!

所以我需要能夠做這樣的事(我知道這語法不正確,我只是想說明什麼,我試圖做):

template<typename T, typename R> 
void quicksort(T<R>& list); 

這樣我就可以知道在執行交換時T中包含什麼類型的對象。顯然,這意味着T本身必須是一個帶有模板參數的模板類,它指定了它包含的類型,但這並不是什麼大不了的事。

這可能嗎?它似乎應該是。這個叫什麼?

回答

3

所有的容器有一個typedef value_type,你可以用它來獲得T

template <typename ContainerT> 
void quicksort(ContainerT& container) 
{ 
    typedef typename ContainerT::value_type ElementT; 
    // etc. 
} 

這就是說,只要有可能,應算法使用迭代器,從特定的容器實現進一步分離它們來實現。例如,

template <typename RandomAccessItT> 
void quicksort(RandomAccessItT first, RandomAccessItT last) 
{ 
    typedef std::iterator_traits<RandomAccessItT>::value_type ElementT; 
    // etc. 
} 
+0

除了內置陣列:-) – 2010-10-29 22:00:55

+0

這將是更好地定義使用'T了'container_traits '結構:: value_type'在主模板,專門用於內置陣列。 – 2010-10-29 22:02:13

+0

@Peter:數組不是容器(其中「容器」的意思是「遵守STL或標準庫容器的概念」)。但是,指向數組的指針可以用作迭代器。最好使用迭代器。 – 2010-10-29 22:02:26

2

如果T是正確的STL容器,你可以得到它的值類型:

typename T::value_type

因此,舉例來說,如果Tstd::vector<std::string>,然後typename T::value_typestd::string

1

您可以使用std :: swap交換兩個值。

你的模板函數應該是這樣的:

template < class ContainterType > 
void quicksort(ContainerType &container) 
{ 
// ... 
}