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