将向量迭代器转换为指针

Dr.*_*ana 5 c++ pointers iterator vector c++11

我有一个矢量std :: vector.我想迭代向量找到匹配,如果找到想要返回指向元素的指针,如下所示:

const int * findint(std::vector <int> &v, int a)
{
        std::vector<int>::const_iterator i1,i2;
        i1 = v.begin();
        i2 = v.end();
        for(;i1 != i2;++i1) {
                if(a== *i1) {
                        return(i1);
                }
        }
        return(0);
}
Run Code Online (Sandbox Code Playgroud)

这是使用GNU g ++ 2.95.3编译器进行编译和工作正常但不能使用GNU g ++ 4.9.2进行编译并给出以下错误:

error: cannot convert 'std::vector<GenFld>::const_iterator {aka __gnu_cxx::__normal_iterator<const int*, std::vector<int> >}' to 'const int*' in return
     [exec]     return(i1);
Run Code Online (Sandbox Code Playgroud)

需要帮忙.

Hum*_*awi 12

这将解决您的问题:

const int * findint(const std::vector <int> &v, int a){
    auto i1 = v.cbegin();
    auto i2 = v.cend();
    for(;i1 != i2;++i1){
        if(a == *i1){
            return &*i1;
        }
    }
    return nullptr;
}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,我将迭代器更改为cbegin,现在cend也将vector其传递为const.

然而,正确的做法IMO(关于nathanoliver 说明):

auto it = std::find(v.cbegin(),v.cend(),value);
decltype(&*it) ptr;
if(it==v.cend()){
    ptr = nullptr;
}
else{
    ptr = &*it;
}
Run Code Online (Sandbox Code Playgroud)

使用它时必须小心.指针和迭代可能是之后的任何无效push_backinserterase在载体,一个全面的列表,请参阅迭代器失效规则.如果你想保留一些线索,以便以后到达某个项目.如果你可以保证只会添加到向量的后面,你可以保留项目的索引:

auto it = std::find(v.cbegin(),v.cend(),value);
size_t index;;
if(it==v.cend()){
    //do something
}
else{
   index = std::distance(v.cbegin(),it)
}
Run Code Online (Sandbox Code Playgroud)

  • 如果向量中没有元素,这会将结束迭代器转换为指针。不能保证它会指向向量存储结束后的一个。如果没有找到元素,函数应该检查这个并返回 `nullptr`。 (2认同)