代码改变世界

Essential c++阅读笔记-第3章 vs2010下vector的find方法排错

2012-11-29 19:20  kennyMc  阅读(834)  评论(0编辑  收藏  举报

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;
}