【发布时间】:2016-12-14 20:15:06
【问题描述】:
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;
}));
}
我需要处理和删除满足特定条件的向量的所有元素,而 erase + remove_if 似乎非常适合。但是,我要做的处理有副作用,我需要确保处理按顺序进行(在玩具示例中,假设我想按照它们在原始向量中出现的顺序打印值)。
假设我的谓词将按顺序在每个项目上调用是否安全?
我认为 C++17 的执行策略会消除这种歧义,但由于 C++17 尚未推出,这显然对我没有帮助。
编辑:另外,这是个好主意吗?或者有没有更好的方法来做到这一点?
【问题讨论】:
-
明确地说,副作用会改变
vector本身吗?这将使在任何情况下使用的迭代器无效,因此最好先确保这一点。我还要警惕可能影响vector中的值 的任何副作用,因为在执行remove_if期间,vector中任何给定项目的确切位置是不保证。 -
不,副作用不会改变向量。副作用实际上是将一些东西写入文件。
-
我认为天气与否没有实际意义。做所有的副作用,然后做删除。
-
不,没有这样的保证。
-
答:使处理没有副作用。分开做。
标签: c++ c++11 stl stl-algorithm erase-remove-idiom