我试图写一个模板化的快速排序功能。我的想法是,我会编写一个快速排序,可以对任何数据结构进行操作,该结构具有下标操作符和包含在其中的对象的顺序关系,所以我可以做类似的事情
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本身必须是一个模板类,模板参数指定它包含的类型,但这并不是什么大不了的事。
这可能吗?看起来应该是这样。这个叫什么?
答案 0 :(得分: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.
}
答案 1 :(得分:2)
如果T
是正确的STL容器,则可以使用以下命令获取值类型:
typename T::value_type
因此,例如,如果T
是std::vector<std::string>
,那么typename T::value_type
就是std::string
。
答案 2 :(得分:1)
您可以使用std :: swap交换两个值。
您的模板功能应如下所示:
template < class ContainterType >
void quicksort( ContainerType &container )
{
// ...
}