【问题标题】:std::remove_if doesn't work correctly in c++ [duplicate]std::remove_if 在 C++ 中无法正常工作 [重复]
【发布时间】:2020-09-17 21:30:08
【问题描述】:

我想删除所有大于 4 的元素,这个程序打印:4 3 1 8 1 并且不正确

std::vector<int> arr1 = { 4, 6, 3, 8, 1 };
std::remove_if(arr1.begin(), arr1.end(), [](int i) {return i>4; });
    print(arr1);

我做错了什么?

【问题讨论】:

    标签: c++ std


    【解决方案1】:

    std::remove_if 实际上并没有删除任何元素。它只将要保留的元素移动到vector 的前面,并将迭代器返回到要删除的第一个元素。 (这适用于任何连续的容器,而不仅仅是vector)。

    然后您需要从该迭代器调用std::vector::erasevectorend 以实际擦除已从arr1 中删除的元素:

    auto last = std::remove_if(arr1.begin(), arr1.end(), [](int i) {return i>4; });
    arr.erase(last, arr.end());
    

    【讨论】:

    • 它不会将元素移动到向量的末尾。它只留下末尾的任何内容,并返回一个迭代器,该迭代器指向序列末尾,该序列是通过删除通过测试的元素而产生的。算法不了解容器;他们对序列进行操作。输出序列[arr.begin(), last) 之后的任何内容都是垃圾。
    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多