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

标签 c++ c++11 stl stl-algorithm erase-remove-idiom

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;
    }));
}

我需要处理和删除满足特定条件的 vector 的所有元素,而 erase + remove_if 似乎非常适合。但是,我将进行的处理有副作用,我需要确保处理按顺序进行(在玩具示例中,假设我想按照它们在原始 vector 中出现的顺序打印值)。

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

我假设 C++17 的执行策略会消除这种歧义,但由于 C++17 尚未发布,这显然对我没有帮助。

编辑:另外,这是个好主意吗?还是有更好的方法来实现这一点?

最佳答案

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

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

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));
}

关于c++ - std::remove_if 是否保证按顺序调用谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38839627/

相关文章:

c++ - 关于尾递归优化

c++ - 在cpp中使用<iomanip>较大的数字时出现问题

c++ - 添加printf语句时NULL指针异常消失

c++ - 如何为结构 vector 重载 <<

c++ - 计数器一直重复请提供答案

c++11 - Clang 3.5和3.6之间的过载分辨率更改是否正确还是错误?

c++ - 基于范围的循环声明必须声明一个变量

c++ - 禁止将右值引用传递给函数

c++ - std::transform 使用 C++0x lambda 表达式

c++ - 智能指针作为多态性的类成员