问题描述
- c++ 编写类似于标准库中find算法的模板,非引用形参和引用形参的区别是什么
-
#include <iostream> #include <string> #include <vector> using namespace std; template<typename Init,typename T> Init find(Init begin,Init end,const T& val){ while(begin!=end){ if(val==(*begin)){ return begin; } ++begin; } return end; } //为什么前2个参数改成引用就不行了 template<typename Init,typename T> Init find_(Init &begin,Init &end,const T& val){ while(begin!=end){ if(val==(*begin)){ return begin; } ++begin; } return end; } int main(){ int arr[5] = {1,2,3,45,5}; string sarr[5] = {"b","c ","dd","ee","ff"}; vector<int> ivec(arr,arr+5); vector<string> svec(sarr,sarr+5); vector<int>::iterator it; vector<string>::iterator sit; if((it=find(ivec.begin(),ivec.end(),3))!=ivec.end()){ cout << *it << "is in the vector" << endl; }else{ cout << "not found!" << endl; } if((sit = fd_(svec.begin(),svec.end(),string("b")))!=svec.end()){ cout << "find" << endl; } else{ cout << "not find"; } }
#把find函数的前两个形参改成引用,会产生编译错误,为什么
error: invalid initialization of non-const reference of type ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >&’ from an rvalue of type ‘std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}’ if((it=find_(ivec.begin(),ivec.end(),3))!=ivec.end()){ ^ error: in passing argument 1 of ‘Init find_(Init&, Init&, const T&) [with Init = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; T = int]’ template<typename Init,typename T> Init find_(Init &begin,Init &end,const T& val){
解决方案
if((it=find(ivec.begin(),ivec.end(),3))!=ivec.end()){
cout << it << "is in the vector" << endl;
}else{
cout << "not found!" << endl;
}
**if((sit = fd_(svec.begin(),svec.end(),string("b")))!=svec.end()){
cout << "find" << endl;
}*
else{
cout << "not find";
}
fd_是不是写错了,应该是find_,若改为find_,我试了一下,自己这可以编译过,没有问题的
解决方案二:
如果加了引用,就相当于要用int来引用iterator,int不是iterator的基类,不能这么做。。而如果是没加引用,这发生了隐式转换,从iterator转换为int型。所以在find那里应该改成iterator的模板转换,这样才能引用。
时间: 2024-08-03 10:04:02