C++ 使用 std::remove_if 删除二维 vector 的元素

标签 c++ c++11

我有一个包含数据的二维 vector ,如果元素/ block 不需要考虑(基于谓词函数),我需要删除它们。这是函数:

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 是包含所有数据的二维 vector 。

问题是:它似乎没有从 block 中删除任何信息,即使 thresholdNegative 函数确实返回 true。

有什么想法吗?

最佳答案

这就是 remove_if 的工作原理。它实际上并没有从容器中移除任何东西(它怎么可能,它只得到两个迭代器?),而只是重新排序元素,以便那些应该留在容器中的元素聚集在容器的开头。然后该函数返回一个迭代器到容器的新末端,您可以使用它来实际删除元素。

d.erase( std::remove_if(begin(d), end(d), threshold_negative), end(d) );

上面一行使用了所谓的Erase-remove idiom。 .

关于C++ 使用 std::remove_if 删除二维 vector 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802604/

相关文章:

c++ - 使用 C++ Boost.Test 组织单元测试?

c++ - C++ STL set 中的计数是如何工作的?

c++ - 创建随机数量的对象

c++ - Valgrind:无效读取大小 8 错误

c++ - qobject_cast<QVBoxLayout*>(layout()),是否合适?

c++ - 在C++中判断一个int是否被赋值有什么优雅的方法吗?

c# - 计算功能限制的最佳方法是什么?

.net - C++ 是否转换为 MSIL?

c++ - 使用抽象类的容器来容纳子类

c++ - C++11 中的线程池