新微赢技术网

标题: [求助]写个count模板函数! [打印本页]

作者: 52巧克力aiq    时间: 2009-11-6 02:00
标题: [求助]写个count模板函数!
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
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
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
#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
你们的都可以!
这个是我的:
#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里不行!
这又是为什么!
作者: ヤforget♀戀    时间: 2009-11-6 02:00
因为你的::iterator约束了数组无法被使用。。。
作者: 单身中    时间: 2009-11-6 02:00
恩,有道理,大概懂些了!

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

我觉得我写的没错啊,光就代码说!
作者: 绝爱吗?    时间: 2009-11-6 02:00
我不知道两个编译器如何分析你的代码的,估计vc编译器在分析“类的内部类型相同时(T::iterator)”不会聪明到可以分析出这个T是否对应.由此导致无法根据给定参数确定模板类型参数。
dev可能可以分辨出来。。。
作者: 没心没肺    时间: 2009-11-6 02:00
恩!!!
再研究研究!呵呵!

thanks!




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2