一个如何实现string和long, int, double模板函数的建议

A piece of advice how to realize a template function for string and long, int, double

本文关键字:double int 函数 一个 何实现 string 实现 long      更新时间:2023-10-16

我有个任务。它说我必须做一个这样的模板函数template <typename T> int reduce(T ar[], int n);。这个函数从最小值到最大值排序,并删除相等的值。它还说我必须使用STL。我不需要解决方案,只需要建议我该怎么做。这就是我的解决方案。

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

您的reduce函数期望一个数组,但您正在传递reduce(&str, str.length());中字符串的地址。这使得它的行为就像你传递一个大小为str.length()std::string数组一样。您需要做的是将字符串转换为字符数组,然后将其传递给函数。

如果你使用的是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;
}

当你必须使用你的接口时,你必须使用char数组而不是std::string,像这样:

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

你还需要修复你的函数reduce返回唯一元素的计数而不是0。