Attualmente sto scrivendo la mia implementazione di unisci sort per esercitazione. Quando si uniscono le parti sinistra e destra dell'elenco, è opportuno creare un elenco temporaneo con solo il più piccolo dei due lati. Tuttavia, la logica cambia a seconda del lato che è stato copiato in un temp.Recurse in una funzione di modello dopo aver modificato il tipo
mia funzione ha la seguente firma:
template<class RandomIt, class Compare>
void Merge(RandomIt begin, RandomIt middle, RandomIt end, Compare Comp);
ho avuto un'idea intelligente per controllare le lunghezze di [begin,middle)
e [middle,end)
all'inizio, e se la sinistra era più grande, convertire i iteratori per iteratori retromarcia e ricorsivamente chiama la funzione In questo modo:
template<class RandomIt, class Compare>
void Merge(RandomIt begin, RandomIt middle, RandomIt end, Compare Comp) {
size_t leftLength = std::distance(begin, middle);
size_t rightLength = std::distance(middle, end);
if (leftLength > rightLength) {
using ReverseIterator = std::reverse_iterator<RandomIt>;
Merge(ReverseIterator(end), ReverseIterator(std::next(middle)), ReverseIterator(begin), Comp);
return;
}
//Now [begin,middle) is guaranteed <= [middle,end)
//...
}
Tuttavia, il compilatore dà un errore piuttosto spesso.
fatal error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum)
ho creato un little stand-alone application on ideone.com che riproduce l'errore.
MODIFICA: Per un mergesort, ho appena realizzato che questo non funzionerà perché la funzione di confronto deve essere invertita.
Capisco che il compilatore sta attraversando quel processo di ricorsivamente deducessero tipi di iteratore nidificato e iteratori inverso. Tuttavia, è chiaro che la profondità di ricorsione non supererà 1. –
'è chiaro che la profondità di ricorsione non supererà 1' ... che è lo stack di chiamate di runtime di cui si sta parlando, giusto? Qui non c'è un caso base per fermare la ricorsione del modello. – Arunmu
Aggiornato con una soluzione che potrebbe funzionare. – Arunmu