ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – std :: remove_if是否保证按顺序调用谓词?

2019-08-24 02:05:08  阅读:202  来源: 互联网

标签:erase-remove-idiom stl-algorithm c c11 stl


std :: remove_if是否总是按顺序调用每个元素的谓词(根据迭代器的顺序),还是可以不按顺序调用?

这是我想做的玩具示例:

void processVector(std::vector<int> values)
{
    values.erase(std::remove_if(values.begin(), values.end(), [](int v)
    {
        if (v % 2 == 0)
        {
            std::cout << v << "\n";
            return true;
        }
        return false;
    }));
}

我需要处理和删除满足特定条件的向量的所有元素,并且擦除remove_if似乎是完美的.但是,我将要做的处理有副作用,我需要确保按顺序处理(在玩具示例中,假设我想按照它们在原始矢量中出现的顺序打印值).

假设我的谓词将按顺序调用每个项目是否安全?

我假设C 17的执行策略会消除歧义,但由于C 17尚未出局,这显然对我没有帮助.

编辑:另外,这是个好主意吗?或者有更好的方法来实现这一目标吗?

解决方法:

该标准不保证调用谓词的顺序.

您应该使用的是stable_partition.您可以根据谓词对序列进行分区.然后,您可以遍历分区序列以执行您想要执行的任何“副作用”,因为stable_partition确保两组数据的相对顺序.然后你可以从矢量中删除元素.

这里必须使用stable_partition,因为erase_if使“擦除”元素的内容不确定.

在代码中:

void processVector(std::vector<int> values)
{
    auto it = std::stable_partition(begin(values), end(values), [](int v) {return v % 2 != 0;});

    std::for_each(it, end(values), [](int v) {std::cout << v << "\n";});

    values.erase(it, end(values));
}

标签:erase-remove-idiom,stl-algorithm,c,c11,stl
来源: https://codeday.me/bug/20190824/1703571.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有