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/