erase-remove_if 成语 - 有什么东西被删除了吗?
erase-remove_if idiom - was anything removed?
我正在创建一个 API 用户将调用它来从内部向量中删除项目。他们将传入标准来搜索要删除的元素的向量。我希望我的 API 到 return 一个布尔值,用于判断是否找到并删除了任何元素。
我打算使用 erase-remove idiom 来保持简单和高效。我没有看到一个明显的方法可以立即检测到项目实际上已被删除?在删除之前存储向量中的元素数量,并比较值,我最好的选择是什么?
这里有一些(未经测试的)示例代码:
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
boolean removeMultiples(int multiple) {
v.erase( std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;}), v.end() );
// return true if anything was removed
}
一个想法是存储 std::remove_if
的 return 值,并在执行 erase
之前将其与容器 end()
迭代器进行比较:
bool removeMultiples(int multiple)
{
auto it = std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;});
bool any_change = it != v.end();
v.erase(it, v.end());
return any_change;
}
算法没必要写成一行。例如,您可以写
bool removeMultiples( int multiple )
{
bool success;
auto it = std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;});
if ( ( success = it != v.end() ) ) v.erase( it, v.end() );
return success;
}
template<class C, class F>
bool remove_some(C&c, F&&f){
using std::begin; using std::end;
auto it = std::remove_if(begin(c), end(c), std::forward<F>(f) );
bool r = it!=end(c);
c.erase(it, end(c));
return r;
}
然后
bool removeMultiples(std::vector<int>& f, int multiple) {
return remove_some(v, [multiple](int i){return !(i%multiple);});
}
简单干净。
我正在创建一个 API 用户将调用它来从内部向量中删除项目。他们将传入标准来搜索要删除的元素的向量。我希望我的 API 到 return 一个布尔值,用于判断是否找到并删除了任何元素。
我打算使用 erase-remove idiom 来保持简单和高效。我没有看到一个明显的方法可以立即检测到项目实际上已被删除?在删除之前存储向量中的元素数量,并比较值,我最好的选择是什么?
这里有一些(未经测试的)示例代码:
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
boolean removeMultiples(int multiple) {
v.erase( std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;}), v.end() );
// return true if anything was removed
}
一个想法是存储 std::remove_if
的 return 值,并在执行 erase
之前将其与容器 end()
迭代器进行比较:
bool removeMultiples(int multiple)
{
auto it = std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;});
bool any_change = it != v.end();
v.erase(it, v.end());
return any_change;
}
算法没必要写成一行。例如,您可以写
bool removeMultiples( int multiple )
{
bool success;
auto it = std::remove_if(v.begin(), v.end(), [multiple](int i){return i%multiple == 0;});
if ( ( success = it != v.end() ) ) v.erase( it, v.end() );
return success;
}
template<class C, class F>
bool remove_some(C&c, F&&f){
using std::begin; using std::end;
auto it = std::remove_if(begin(c), end(c), std::forward<F>(f) );
bool r = it!=end(c);
c.erase(it, end(c));
return r;
}
然后
bool removeMultiples(std::vector<int>& f, int multiple) {
return remove_some(v, [multiple](int i){return !(i%multiple);});
}
简单干净。