2016-05-03 18 views
-1

テンプレートを使用して、最小の配列から最大の配列に異なる種類の配列を並べ替えることを試みています。テンプレートを使用して文字列と文字を並べ替える

正しく並べ替えるためにint配列を取得しましたが、並べ替えから文字配列または文字列配列を取得できませんでした。私は "bsort(char [10]、int)"と "bsort(std :: string [10]、int)への呼び出しに一致する関数がありません"というエラーが出てきました。私は間違って何をしていますか?

私のテンプレートでは、 "Object"宣言によってすべての異なる型に対応していると思いました。

#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; 

}

**編集、私が最初に[]という試みたが、それはまだそれが必要私に

答えて

3
void bsort(Object *array, Object n) 

を与えたことをソート/エラーを変更するために何もしませんでしたこと

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

Demo

+0

さらに、 'template void bsort(ITERATOR begin、ITERATOR end)' – SergeyA

+0

@SergeyA:あるいはもっとうまく 'std :: sort'を直接使う:-) – Jarod42

0

テンプレートの控除を利用することで、毎回タイプやサイズを指定する必要がありません。

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; 
      } 
     } 
    } 
} 

これは問題ありませんが、毎回サイズを指定する必要があります。このため

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

、あなたは非常に単純なテンプレートラッパー(私は2つを置く)を作成することができます:

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); 
} 

を二番目の理由は、ということですこれは、あなたがこのようにそれを宣言した場合は迷惑かもしれませんあなたはsize_t refを渡すことができ、それはサイズとして設定されます。たとえば、あなたはこれらのいずれかを実行することができます:あなたは最後のものを使用したい場合があり

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); 

理由は、今あなたが正しいサイズを印刷する方法を持っているということです。もちろん

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"; 

この特定のテンプレートにのみ、動的に割り当てられたものが、あなたは常に他のコールを使用することができない、スタックベースのアレイ上で動作します。