我有一个包含数据的2D向量,如果它们不值得考虑(基于谓词函数),我需要删除元素/块。这是功能:
bool thresholdNegative (vector<double> val)
{
//short threshold = 10000;
double meansquare = sqrt ( ( std::inner_product( val.begin(), val.end(), val.begin(), 0 ))/(double)val.size() );
if(meansquare < 0)
{
return true;
}else{
return false;
}
}
我使用以下内容:
std::remove_if(std::begin(d), std::end(d), thresholdNegative);
其中d
是包含所有数据的2D矢量。
问题在于:它似乎没有从块中删除任何信息,即使函数thresholdNegative
确实返回true。
任何想法为什么?
答案 0 :(得分:5)
这就是remove_if
的工作方式。它不会从容器中删除任何东西(怎么可能,它只能获得两个迭代器?),而只是重新排序元素,以便那些应该留在容器中的元素被收集在容器的开头。然后,该函数将迭代器返回到容器的新端,您可以使用它来实际删除元素。
d.erase( std::remove_if(begin(d), end(d), threshold_negative), end(d) );
以上一行使用的是Erase-remove idiom。
答案 1 :(得分:2)
擦除是通过以下方式完成的:
auto newEnd = std::remove_if(std::begin(d), std::end(d), thresholdNegative);
d.erase(newEnd, end(d));