找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 621|回复: 8

[求助]写个count模板函数!

[复制链接]
发表于 2009-11-6 02:00:50 | 显示全部楼层 |阅读模式 IP:江苏扬州
template<class InputIterator, class T> inline   size_t count(      InputIterator First,      InputIterator Last,      const T& Value   )上面这个是stl中count函数的原型!哪位大哥写下,怎么实现在一对迭代器中数指定元素出现次数。当然用模板哦!我写出来的,但是有问题,在dev-cpp中可以运行,在vs2005中报错。先看看别人怎么写!谢谢了!
发表于 2009-11-6 02:00:50 | 显示全部楼层 IP:江苏扬州
template<class InputIterator, class T>
inline size_t count(InputIterator First,InputIterator Last,const T& Value)
{
int count=0;
for(InputIterator ii=First;ii!=Last;ii++)
if(Value==*ii)
count++;
return count;
}
回复

使用道具 举报

发表于 2009-11-6 02:00:52 | 显示全部楼层 IP:江苏扬州
Since you did not post your code, I don't know what you wrote. Here is an example:

  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <iterator>
  5. #include <string>
  6. using namespace std;
  7. // modern trend is to use typename as possible,
  8. // class for typename is a misnomer.
  9. template<typename InputIterator, typename T>
  10. inline size_t count_my( InputIterator First, InputIterator Last, const T& Value )
  11. {
  12. size_t n=0;
  13. while(First!=Last)
  14. {
  15. if(*First == Value) // this may have problem since not all types have "==" defined
  16. ++n;
  17. ++First;
  18. }
  19. return n;
  20. }
  21. int main(int argc, char** argv)
  22. {
  23. vector<int> vi;
  24. size_t n;
  25. vi.push_back(1);
  26. vi.push_back(2);
  27. vi.push_back(1);
  28. vi.push_back(3);
  29. n = count_my(vi.begin(), vi.end(), 1);
  30. cout<<n<<endl; // outputs 2
  31. list<string> ls;
  32. ls.push_back("to");
  33. ls.push_back("be");
  34. ls.push_back("or");
  35. ls.push_back("not");
  36. ls.push_back("to");
  37. ls.push_back("be");
  38. n = count_my(ls.begin(), ls.end(), string("to"));
  39. cout<<n<<endl; // outputs 2
  40. return 0;
  41. }
复制代码
回复

使用道具 举报

发表于 2009-11-6 02:00:53 | 显示全部楼层 IP:江苏扬州
#include<vector>
#include<algorithm>
#include<iostream>
int main()
{
using namespace std;
vector<int>v1;
vector<int>::iterator it;
cout<<"please Enter a number you want to input:"<<endl;
int n,m,val;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>m;
v1.push_back(m);
}
cout<<"v1=(";
for(it=v1.begin();it!=v1.end();it++)
cout<<*it<<" "<<")"<<endl;
cin>>val;
vector<int>::iterator::difference_type result;
result = count(v1.begin(), v1.end(), val);
cout << "The count of val is " << result << endl;
system("pause");
return 0;
}
回复

使用道具 举报

发表于 2009-11-6 02:00:54 | 显示全部楼层 IP:江苏扬州
你们的都可以!
这个是我的:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
template<typename tcon,typename tval>
size_t count(typename tcon::iterator fir,typename tcon::iterator sec,
const tval &key){
size_t i = 0;
for (;fir != sec;++fir)
if (*fir == key)
++i;
return i;
}

int main(){
vector<string> svec;
string temp;
while (cin >> temp)
svec.push_back(temp);
size_t i = count(svec.begin(),svec.end(),string("love"));
cout << i << endl;
system("pause");
return 0;
}
你们都把迭代器直接作为类型参数去操作,我觉得是把容器类型作为模板参数,再用typename去指定迭带器,去作为形参。
究竟这个模板参数怎么去选择?我有点迷惑了!你们怎么就不约而同的这样去实现呢?
还有,我这个在dev-cpp里是可以的,但是在2005里不行!
这又是为什么!
回复

使用道具 举报

发表于 2009-11-6 02:00:55 | 显示全部楼层 IP:江苏扬州
因为你的::iterator约束了数组无法被使用。。。
回复

使用道具 举报

发表于 2009-11-6 02:00:56 | 显示全部楼层 IP:江苏扬州
恩,有道理,大概懂些了!

最后就是为什么在dev里可以通过,在2005里不可以呢?

我觉得我写的没错啊,光就代码说!
回复

使用道具 举报

发表于 2009-11-6 02:00:57 | 显示全部楼层 IP:江苏扬州
我不知道两个编译器如何分析你的代码的,估计vc编译器在分析“类的内部类型相同时(T::iterator)”不会聪明到可以分析出这个T是否对应.由此导致无法根据给定参数确定模板类型参数。
dev可能可以分辨出来。。。
回复

使用道具 举报

发表于 2009-11-6 02:00:59 | 显示全部楼层 IP:江苏扬州
恩!!!
再研究研究!呵呵!

thanks!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 19:36 , Processed in 0.195640 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表