将向量迭代器转换为指针

时间:2016-05-20 11:49:43

标签: c++ pointers c++11 vector iterator

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

需要帮助。

3 个答案:

答案 0 :(得分:12)

这将解决您的问题:

get_template_directory_uri

修改:请注意,我将迭代器更改为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; } cbegincend现在又作为vector传递。

然而,正确的做法IMO(关于nathanoliver注意):

const

使用它时必须小心。在向量上的任何auto it = std::find(v.cbegin(),v.cend(),value); decltype(&*it) ptr; if(it==v.cend()){ ptr = nullptr; } else{ ptr = &*it; } push_backinsert之后,指针和迭代器可能无效,有关综合列表,请参阅Iterator invalidation rules。如果你想保留一些线索,以便以后到达某个项目。如果你能保证只会添加到向量的后面,你可以使用以下方法保留项目的索引:

erase

答案 1 :(得分:1)

你可以做这样的事情

auto i1 = std::find(v.begin(), v.end(), a);
if(i1 != v.end())
{
    index = std::distance(v.begin(), i1); 
    return(&v[index])
}
else
{
    return NULL;
}

答案 2 :(得分:1)

使用v.data()

const int * findint(const std::vector <int> &v, int a)
{
  const int * const b = v.data();
  const int * const e = b + v.size();
  const int * const r = std::find(b, e, a);
  return (r == e) ? nullptr : r;
}
相关问题