2015-08-14 28 views
1

我有一個任務。它說我必須製作這樣的模板功能template <typename T> int reduce(T ar[], int n);。這個函數確實從最小值到最大值進行排序並刪除相等的值。另外它說我必須使用STL來製作它。我不需要解決方案,只需要建議我應該怎麼做。這是我的解決方案。一條忠告如何實現字符串和long的模板函數,int,double

template <typename T> 
int reduce(T ar[], int n) 
{ 
    ostream_iterator<int, char> out_iter(cout, " "); 

    T * iter_begin = ar; 
    T * iter_end = ar + n; 

    sort(iter_begin, iter_end); 
    copy(iter_begin, iter_end, out_iter); 
    cout << endl; 

    iter_end = unique(iter_begin, iter_end); 
    copy(iter_begin, iter_end, out_iter); 

    //erase(iter_begin, iter_end); 

    return 0; 
} 

void main() 
{ 
    srand((unsigned)time(NULL)); 


    int size = 20; 
    long * mas = new long[size]; 

    for (int i = 0; i < size; i++) 
     mas[i] = rand() % size + 1; 

    reduce(mas, size); 

    string str = "hello how are you doing"; 
    reduce(&str, str.length()); 

    delete[] mas; 
} 
+2

什麼在您的解決方案中不起作用? – Slava

+0

@Slava VS說錯誤在'sort()'中,如果我使用'std :: string' – Mikhail

+1

'string str =「你好,你好嗎」; reduce(&str,str.length());'不是你想要的。你告訴它你正在傳遞一個'string'對象的數組,它的長度是'str.length()',但是你真的把它傳遞給了一個'string'的指針。 – Chad

回答

1

您的reduce函數需要一個數組,但您傳遞的是字符串地址reduce(&str, str.length());。這使得它的行爲與您傳遞的std::string數組的大小爲str.length()一樣。你需要做的是convert the string to a char array然後傳遞給函數。

+0

我想我會再一次閱讀STL章節。 – Mikhail

+2

@Mikhail在現實中,函數應該像標準函數一樣採用「迭代器」,然後你的函數看起來像'template void reduce(RandomAcessIterator beginning,RandomAcessIterator end)' – NathanOliver

+0

其實我知道hot與其他函數方式,但它說我必須只使用STL方法來做。 – Mikhail

1

如果你使用STL,你應該讓你的函數的方式實現的STL算法一樣,像std::sort你使用:

template <typename Iter> 
int reduce(Iter iter_begin, Iter iter_end) 
{ 
    ostream_iterator<int, char> out_iter(cout, " "); 

    sort(iter_begin, iter_end); 
    copy(iter_begin, iter_end, out_iter); 
    cout << endl; 

    iter_end = unique(iter_begin, iter_end); 
    copy(iter_begin, iter_end, out_iter); 

    //erase(iter_begin, iter_end); 

    return 0; 
} 

int main() 
{ 
    srand((unsigned)time(NULL)); 

    const int size = 20; 
    long mas[size]; 

    for (int i = 0; i < size; i++) 
     mas[i] = rand() % size + 1; 

    reduce(mas, mas + size); 

    string str = "hello how are you doing"; 
    reduce(str.begin(), str.end()); 
    return 0; 
} 

至於你必須使用你的界面,你將不得不使用字符數組代替的std::string,像這樣:

char str[] = "hello how are you doing"; 
int len = reduce(str, strlen(str)); 
str[len] = 0; 

您還需要修復你的函數reduce返回的獨特元素的數量而不是0

+0

@斯拉瓦謝謝你這是偉大的解決方案,但我不允許使用任何容器。 – Mikhail

+1

@Mikhail技術上來說'std :: string'是一個容器。但是我已經改變了使用數組而不是'std :: vector'的例子。你原來的動態分配數組將會工作,我只是不明白你爲什麼需要它。 – Slava

+0

@ Slava主要問題是我必須從數組中刪除所有相等的值。 – Mikhail

相關問題