擦除remove_if成语 - 删除了什么吗?
erase-remove_if idiom - was anything removed?
我正在创建一个API,用户将调用该API从内部向量中删除项目。 它们将传入条件以在向量中搜索要删除的元素。 我希望我的 API 返回一个布尔值,以便在找到并删除任何元素时返回。
我打算使用擦除-删除成语来保持简单和高效。 我没有看到一种明显的方法来检测项目实际上已被删除? 在删除之前存储向量中的元素数量并比较值是我的最佳选择吗?
以下是此习语的一些(未经测试的)示例代码:
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
的返回值,并在执行如下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);});
}
简单干净。
相关文章:
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 在析构函数中删除单链表的正确方法是什么?
- 处理从列表中删除指向对象的指针的"healthy"方法是什么?
- 将此私有删除器函数包装在结构中的目的是什么?
- 删除类成员的动态分配内存的最佳方法是什么
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 在这种情况下,删除指针数组期间会发生什么?
- 为什么你会=删除隐式删除的默认构造函数,有什么意义?
- 当删除或删除[]被执行时,计算机会做什么?
- 如果在删除后使用 delete[] 会发生什么?
- 擦除remove_if成语 - 删除了什么吗?
- 如果我不删除动态创建的变量会发生什么
- 删除数组成员的更好方法是什么?
- 删除默认类构造函数有什么意义?
- 定义无删除指针的最干净方法是什么
- 使用动态指针数组进行动态对象分配 - 使用什么删除?