vs2010下书上的find方法(指针哨兵)无法编译通过,这里发现2个错误
1:begin和end是系统已存在的方法,返回迭代器类型,这里书上自己命名的begin和end内联函数在调用的时候会被替换成系统的,所以会出现iterator无法转换为指针的错误。
2:&vec[vec.size()]这样在vs2010下计算end指针报错,无法通过越界下标来得到最后一个元素后面一个指针,只能采用头元素指针加vec.size()的方法来获得end指针。
#include <iostream> #include <vector> #include <string> #include <typeinfo> using std::cout; using std::endl; using std::vector; using std::string; //数组指针加结束(哨兵)指针,类似于迭代器 template<typename T> const T* find2(const T *beg,const T *end,const T &value) { if(!beg || !end) return 0; for(;beg!=end;++beg) { if(*beg==value) return beg; } return 0; } //c++库中存在begin和end,形参是vector引用,返回iterator类型 //所以我在调用的时候并没有使用自己定义的函数,这里就会出现iterator无法转换为指针的错误 //template<typename T> //inline T* begin(const vector<T> &vec) //{ // return vec.empty()?0:&vec[0]; //} //template<typename T> //inline T* end(const vector<T> &vec) //{ // return vec.empty()?0:&vec[vec.size()]; //} template<typename T> inline const T* beg(const vector<T> &vec) { return vec.empty()?0:&vec[0]; } template<typename T> inline const T* ed(const vector<T> &vec) { //书上作者用的这样的写法,但是vs2010编译报错,这里显然索引超出了界限 //return vec.empty()?0:&vec[vec.size()]; //所以这里还是用数组的方法,头指针加vec.size() return vec.empty()?0:(&vec[0]+vec.size()); } int main() { vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(2); int val=4; cout<<typeid(begin(vec)).name()<<endl;//输出是iterator类型 const int *p=find2(beg(vec),ed(vec),val); cout<<"*p="<<(p==0?0:*p)<<endl; system("PAUSE"); return 0; }