erase-remove_if成语 - 删除了什么?

时间:2017-05-24 21:28:08

标签: c++ algorithm function std idioms

我正在创建一个API,用户将调用该API以从内部向量中删除项目。他们将通过标准来搜索要删除的元素的向量。如果发现并删除任何元素,我希望我的API返回一个布尔值。

我打算使用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
}

4 个答案:

答案 0 :(得分:4)

一个想法是存储std::remove_if的返回值,并在执行end()之前将其与容器erase迭代器进行比较:

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

答案 1 :(得分:2)

无需在一行中编写算法。你可以写例如

auth.js?b7de:487 Error (@websanova/vue-auth): vue-resource.1.x.js : Vue.http must be set.

答案 2 :(得分:0)

如何在从函数返回之前检查向量的初始大小和当前大小?

// returns true if element(s) are removed
bool vectorRemove(std::vector<int>& v, int criterion)
{
   const unsigned int initial_size = v.size();
   // implement the logic of removal after criteria check
   return initial_size != v.size();
}

答案 3 :(得分:0)

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

简单而干净。