将向量迭代器转换为指针

新手上路,请多包涵

我有一个向量 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);
}

这是使用 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);

需要帮忙。

原文由 Dr. Debasish Jana 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 960
1 个回答

这将解决您的问题:

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

Edit : Note that I changed iterators to cbegin and cend also the vector is now passed as const .

但是,IMO 的正确做法(关于 nathanoliver 注释):

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

使用它时必须小心。在向量上的任何 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)
}

原文由 Humam Helfawi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题