一条建议如何实现字符串和long,int,double的模板函数

时间:2015-08-14 17:45:08

标签: c++ stl

我有一项任务。它说我必须制作这种模板函数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;
}

2 个答案:

答案 0 :(得分:1)

你的reduce函数需要一个数组,但是你要传递reduce(&str, str.length());中字符串的地址。这使得它在传递大小为std::string的{​​{1}}数组时表现得像。您需要做的是convert the string to a char array,然后将其传递给函数。

答案 1 :(得分: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;
}

由于你必须使用你的界面,你将不得不使用char数组而不是std::string,如下所示:

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

您还需要修复函数reduce以返回唯一元素的数量,而不是0。