2016-05-03 15 views
-1

Ich versuche, verschiedene Arten von Arrays von der kleinsten zur größten Reihenfolge mithilfe von Vorlagen zu sortieren.Verwenden von Vorlagen zum Sortieren von Zeichenfolgen und Zeichen

Obwohl ich das int-Array korrekt sortiert habe, konnte ich die Zeichen- oder String-Arrays nicht sortieren. Ich bekam immer einen Fehler, der sagte "keine passende Funktion für den Aufruf von bsort (char [10], int)" und "bsort (std :: string [10], int)". Was mache ich falsch?

In meiner Vorlage dachte ich, dass ich es durch die "Object" -Deklaration allen verschiedenen Typen entgegenbringen würde.

#include <iostream> 
#include <string> 
using namespace std; 


template <class Object> 
void bsort(Object a[], Object n) 
{ 
    for (int i=0; i<n-1; i++) 
    { 
     for (int j=i+1; j<n; j++) 
      { 
       if(a[i]>a[j]) 
       { 
        Object item; 
        item=a[i]; 
        a[i]=a[j]; 
        a[j]=item; 
       } 
      } 
    } 
} 


int main() 
{ 
    int intarray[10]= {50, 10, 20, 15, 62, 32, 6, 80, 90, 100}; 
    char chararray[10]= {'a', 'f', 'v', 'b', 'c', 's', 'm', 'i', 'j', 'i'}; 
    string stringarray[10]= {"hi", "how", "are", "you", "today", "love", "eating", "food", "brownies", "icecream"}; 

cout<<"The intarray consists of"<<endl; 
for (int i=0; i<10; i++) 
    cout<<intarray[i]<<endl; 

cout<<"The sorted intarray sorted is"<<endl; 
bsort(intarray, 10); 
for (int i=0; i<10; i++) 
    cout<<intarray[i]<<endl; 

cout<<"Sorted char array"<<endl; 
bsort(chararray, 10); 
for (int i=0; i<10; i++) 
    cout<<chararray[i]<<endl; 

cout<<"The sorted stringarray is"<<endl; 
bsort(stringarray, 10); 
for (int i=0; i<10; i++) 
    cout<<stringarray[i]<<endl; 

return 0; 

}

** bearbeiten, habe ich versucht, dass a [] auf den ersten, aber es hat immer noch nichts tun, um die Sortierung zu ändern/Fehler, dass es mich gab

Antwort

3
void bsort(Object *array, Object n) 

sollte sein

void bsort(Object *array, std::size_t n) 

Demo

+0

Noch besser noch, 'Vorlage void bsort (ITERATOR beginnen, ITERATOR Ende)' – SergeyA

+0

@SergeyA: Oder noch besser, verwenden Sie 'std :: sort' direkt :-) – Jarod42

0

Sie können den Vorteil der Vorlagenabzüge nutzen, sodass Sie nicht jedes Mal einen Typ oder eine Größe angeben müssen.

template <class Object> 
void bsort(Object *array, int n) { 
    for (int i = 0; i < n - 1; ++i) { 
     for (int j = i + 1; j<n; ++j){ 
      if (array[i] > array[j]) { 
       Object item; 
       item = array[i]; 
       array[i] = array[j]; 
       array[j] = item; 
      } 
     } 
    } 
} 

Das ist in Ordnung, aber Sie müssen jedes Mal eine Größe angeben. Dieses ärgerlich sein könnte, wenn man es wie folgt erklärt:

intarray[] = {3, 1, 5, 2, 0, 8, 6, 9, 4, 7}; // do you really want to count these? 

Dazu Sie eine sehr einfache Vorlage-Wrapper erstellen (Ich habe zwei):

template<class Object, size_t N> 
void bsort(Object(&o)[N]) { 
    return bsort<Object>(o, N); 
} 

template<class Object, size_t N> 
void bsort(Object(&o)[N], size_t &size) { 
    size = N; 
    return bsort<Object>(o, N); 
} 

Der Grund für die zweite ist, dass Sie können eine size_t ref hineingeben und es wird als Größe festgelegt. Zum Beispiel könnten Sie entweder von diesen laufen:

int intarray[] = {3, 1, 5, 2, 0, 8, 6, 9, 4, 7}; 
bsort(intarray); 
bsort<int>(intarray, 10); // <int> is rather unnecessary 
size_t size = 0; 
bsort(intarray, size); 

Der Grund, warum Sie die letzten wollen können, ist verwenden, dass Sie jetzt eine Möglichkeit, den Druck, die richtige Größe haben.

int intarray[] = {3, 1, 5, 2, 0, 8, 6, 9, 4, 7}; 
size_t size = 0; 
bsort(intarray, size); 
for(size_t i = 0; i < size; ++i) 
    std::cout << intarray[i] << "\n"; 

Natürlich ist diese bestimmte Vorlage nur auf Stack-basierten arbeiten Arrays, nicht dynamisch zugeordnet sind, aber man kann immer den anderen Anruf verwenden.

Verwandte Themen