首页 文章

使用'find'或'remove'中的迭代器擦除

提问于
浏览
7

我想知道从C中向量中移除元素的最佳做法是什么 .

我见过多次使用std :: remove来查找和删除元素,然后使用erase从向量中删除元素 .

但是为什么它比使用find获取要删除的元素的迭代器然后使用该迭代器的擦除更好?

谢谢

1 回答

  • 15

    std::find 后跟 vector::erase 将删除第一次出现的具有 vector 给定值的对象 .

    std::vector<int> vec{1,3,3,8,3,5};
    vec.erase(std::find(vec.begin(), vec.end(), 3));
    //vec == {1,3,8,3,5}
    

    std::remove 后跟 vector::erase 将删除具有 vector 中给定值的对象的每次出现 .

    std::vector<int> vec{1,3,3,8,3,5};
    vec.erase(std::remove(vec.begin(), vec.end(), 3), vec.end());
    //vec == {1,8,5}
    

    两者都不是更好,他们只是做不同的事情 .

    std::remove 更普遍有用,这就是为什么它更常见;特别是, std::remove 后跟 vector::erase 在向量中不存在该元素时不执行任何操作,而 std::find 后跟 vector::erase 具有未定义的行为 .

    注意,“find-erase”,“remove-erase”都保持元素的相对顺序 . 如果要从向量中删除元素但不关心元素的结果顺序,可以使用“find-move-pop_back”或“partition-erase”:

    //find-move-pop_back
    std::vector<int> vec{1,3,3,8,3,5};
    *std::find(vec.begin(), vec.end(), 3) = std::move(vec.back());
    vec.pop_back();
    
    //partition-erase
    std::vector<int> vec{1,3,3,8,3,5};
    vec.erase(
        std::partition(vec.begin(), vec.end(), [](int v){return v == 3;}),
        vec.end());
    

相关问题