对于不明确的问题,我们深表歉意。我需要使用以下模板使用插入算法对属于自定义类的对象数组进行排序:
template<typename pointer, typename T, typename Functype>
void sort_array(pointer puntatore, T* obj, int dim, Functype pred){
T val;
for(int i=1; i<dim; i++){
val=obj[i];
for(int j=(i-1); j>=0; j--){
if(pred(obj[j].*puntatore, val.*puntatore)){
obj[j+1]=obj[j];
obj[j]=val;
}
}
}
}
我想知道如何编写一个更通用的模板,它可以接受任何类型的迭代器,它指向类T
的对象,而不仅仅是指针。在参数列表中编写T obj
会让我在赋值中遇到变量T val
的问题,在这种情况下,*val=obj[i]
就像val
本身就是迭代器。有没有办法告诉模板他必须采用指向类T
的对象的泛型迭代器(即以同样的方式编写T*
告诉它期望指向类的对象的指针{ {1}})?
我如何使用此模板的示例
T
答案 0 :(得分:2)
您可以从STL实现中获取灵感,并提供一个接口,该接口将采用范围而不是如下所示的数组:
template<typename BidirectionalIterator, typename Predicate =
std::less<typename std::iterator_traits<BidirectionalIterator>::value_type>>
void
insertion_sort(BidirectionalIterator first, BidirectionalIterator last,
Predicate pred = {}) {
if(first != last) {
auto it = first;
while(++it != last) {
auto it2 = it;
while(it2 != first) {
auto it3 = it2;
--it3;
if(pred(*it2, *it3)) {
std::swap(*it2, *it3);
} else {
break;
}
--it2;
}
}
}
}
请注意,您还可以为对象提供重载的operator<
或operator>
,以便使用标准谓词:
bool
operator<(T const &A, T const &B) {
return A.*puntatore < B.*puntatore;
}
bool
operator>(T const &A, T const &B) {
return A.*puntatore < B.*puntatore;
}