C++类模板

xidianxiancai 2009-09-30 03:45:37

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template <typename T>
typename T::value_type mostFre(T first, T last)
{
typedef vector<typename T::value_type> VecType;
VecType vec;
copy(first, last, back_inserter(vec));
VecType::iterator newfirst = vec.begin();
VecType::iterator newlast = vec.end();
sort(newfirst, newlast);
size_t maxOccu = 0, occu = 0;
VecType::iterator preIter = vec.begin();
VecType::iterator maxOccuElemIt = vec.begin();
while (newfirst!=newlast)
{
if (*newfirst != *preIter)
{
if (occu > maxOccu)
{
maxOccu = occu;
maxOccuElemIt = preIter;
}
occu = 0;
}
++occu;
preIter = newfirst;
++newfirst;
}
if (occu > maxOccu)
{
maxOccu = occu;
maxOccuElemIt = preIter;
}
return *maxOccuElemIt;
}
int main()
{
int ia[] = {1,2,7,4,3,6,7};
vector<int> ivec(ia,ia+7);
cout << "found this element: " << mostFre(ivec.begin(),ivec.end()) << endl;
return 0;
}


这个程序感觉有点问题,在调用函数的时候,实参是迭代器,是int *型
但是被调用函数的形参T却是vector<int>类型
这样岂不是无法实现传递?
可是我在VS2005上却能运行通过,请问这该如何解释?
...全文
187 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aeris 2009-10-02
  • 打赏
  • 举报
回复
1.vector<T>::iterator的实现,许多流行的版本(例如VS和GCC的STL)就直接是T *,而不是自己定义的一个iterator。
2.对于T类型的数组,可以把T *看作random-access迭代器,指向第一个元素的指针看作begin,指向最后一个元素后面的指针看作end
ketet 2009-10-02
  • 打赏
  • 举报
回复
楼主的头像太难看了
menghai1226 2009-10-02
  • 打赏
  • 举报
回复
学习啦
xidianxiancai 2009-10-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 freezezdj 的回复:]
模板函数的参数是根据你给他的参数,
他给你编译出相应类型的函数代码。

是可以自动识别的,而且最好是自动识别。

你给他指针他就是指针。
你给他int他就给你识别为int。
当然出了错,他不负责。

template <typename T>
typename T::value_type mostFre(T first, T last) ;

int ia[] = {1,2,7,4,3,6,7};
vector <int> ivec(ia,ia+7);

你给他指针了,他就是指针了。
你没有给他vector <int>吧。
[/Quote]
那楼上的意思是说这个程序有问题?那这样的话,如何修改呢?
冻结 2009-10-02
  • 打赏
  • 举报
回复
mostFre(ivec.begin(),ivec.end());
给的是迭代器当然给你解析成迭代器函数。

冻结 2009-10-02
  • 打赏
  • 举报
回复
模板函数的参数是根据你给他的参数,
他给你编译出相应类型的函数代码。

是可以自动识别的,而且最好是自动识别。

你给他指针他就是指针。
你给他int他就给你识别为int。
当然出了错,他不负责。

template <typename T>
typename T::value_type mostFre(T first, T last) ;

int ia[] = {1,2,7,4,3,6,7};
vector<int> ivec(ia,ia+7);

你给他指针了,他就是指针了。
你没有给他vector <int>吧。
xidianxiancai 2009-10-02
  • 打赏
  • 举报
回复
没人能回答我的问题吗?
qqwx_1986 2009-09-30
  • 打赏
  • 举报
回复
你传的是个迭代器能是什么类型?
xidianxiancai 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhixi 的回复:]
引用 6 楼 xidianxiancai 的回复:
template <typename T>
typename T::value_type mostFre(T first, T last)
这里的T难道不是vector <int>类型,而是vector <int>::iterator 类型吗?

你觉得呢
[/Quote]
我不知道。所以才问的嘛
谢谢
pengzhixi 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xidianxiancai 的回复:]
template <typename T>
typename T::value_type mostFre(T first, T last)
这里的T难道不是vector <int>类型,而是vector <int>::iterator 类型吗?
[/Quote]
你觉得呢
xidianxiancai 2009-09-30
  • 打赏
  • 举报
回复
template <typename T>
typename T::value_type mostFre(T first, T last)
这里的T难道不是vector <int>类型,而是vector <int>::iterator 类型吗?
xidianxiancai 2009-09-30
  • 打赏
  • 举报
回复
template <typename T>
typename T::value_type mostFre(T first, T last)
这里的T难道不是vector <int>类型,而是vector <int>::iterator 类型吗?
pengzhixi 2009-09-30
  • 打赏
  • 举报
回复
这个程序感觉有点问题,在调用函数的时候,实参是迭代器,是int *型
但是被调用函数的形参T却是vector <int>类型

调用:mostFre(ivec.begin(),ivec.end())这说明T的类型就是vector<int>::iterator 类型。

这没什么问题啊,你怎么说被调用函数的形参T却是vector <int>类型
cyldf 2009-09-30
  • 打赏
  • 举报
回复
但是被调用函数的形参T却是vector <int>类型

楼主你从哪看出来的?
ACgirl 2009-09-30
  • 打赏
  • 举报
回复
是参数决定的类型,哪里有形参有关?
yshuise 2009-09-30
  • 打赏
  • 举报
回复
同意楼主的意见。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧