[英]converting vector iterator to pointer
我有一个矢量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);
需要帮忙。
这将解决您的问题:
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;
}
编辑 :请注意,我改变了迭代器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;
}
使用它时必须小心。 在向量上进行任何push_back
或insert
或erase
后,指针和迭代器可能无效,有关综合列表,请参阅迭代器失效规则 。 如果你想保留一些线索,以便以后到达某个项目。 如果你可以保证只会添加到向量的后面,你可以保留项目的索引:
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)
}
你可以这样做
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;
}
使用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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.