#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的模板转换,这样才能引用。