簡體   English   中英

將向量迭代器轉換為指針

[英]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;
}

編輯 :請注意,我改變了迭代器cbegincend也是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_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)
}

你可以這樣做

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM