c++ vector容器通过迭代器删除元素中奇数问题
阿神
阿神 2017-04-17 13:57:38
0
3
639

vector中的元素{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
为什么使用下面的方法可以删除vector容器的偶数

for(auto vbegin = va.begin(); vbegin != va.end(); ++vbegin)
{
    if(!(*vbegin % 2))
    {
        va.erase(vbegin);
    }
}

而当使用类似的方法删除奇数时会报错代码如下,错误提示:Signal: SIGSEGV (Segmentation fault)

for(auto vbegin = va.begin(); vbegin != va.end(); ++vbegin)
    {
        if(*vbegin % 2)
        {
            va.erase(vbegin);
        }
    }
阿神
阿神

闭关修行中......

全部回覆(3)
大家讲道理

樓上的方案將迭代器賦值給begin()是可以達到效果的,但是每次都會重頭開始遍歷,降低了效率。而另一個複製迭代器會遇到越界的問題。
這是我的方案:

{
    std::vector<int> vec = {1,2,3,4,5,6,7,8,9};
    auto itr = vec.begin();
    while (itr != vec.end()) {
        if (*itr % 2) {
            itr = vec.erase(itr);
        } else {
            itr++;
        }
    }//done
} 
Ty80

C++ 的迭代器在刪除(erase)之後就失效了,
所以在 va.erase(vbegin); 執行後 ++vbegin 的效果是未知的。

建議在if區塊內定義一個暫時的迭代器用來刪除容器元素

if( any condition about vbegin )
{
    vector<int>::iterator element_to_delete = vbegin;
    ++vbegin;
    va.erase(element_to_delete);
}
Ty80

兩種都錯了,因為erase呼叫之後迭代器會失效,你需要

va.erase(vbegin);
vbegin = va.begin();

查資料,去弄清楚erase咋回事

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!