我正在创建一个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
}
答案 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);});
}
简单而干净。