c++ - 删除二维 vector 的元素

标签 c++ vector

我有一个二维 vector ,我需要删除不包含足够值的 block :

typedef vector<double> iniMatrix;


bool hasInsufficientEnergy() {
return true;
}
vector<double> Audio::filter(vector<iniMatrix>&blocks, double sumThres, double ZeroThres)
{
  vector<double> totalEnergy;
  vector<double> totalZeroCross;
  double totalSum = sumThres * blocks.size();
  double totalZero = ZeroThres * blocks.size();

  vector<iniMatrix> blockked;

  for(unsigned i=0; (i < blocks.size()); i++)
  {
    totalEnergy.push_back(abs(this->energy(blocks[i])));
    totalZeroCross.push_back(zerocross(blocks[i]));

    if(!totalEnergy[i] > totalSum || totalZeroCross[i] < ZeroThres)
    {
        hasInsufficientEnergy();
    }else{
        //hasInsufficientEnergy();
    }
    iniMatrix::iterator erase_after = remove_if(blocks[i].begin(), blocks[i].end(),
                                                &hasInsufficientEnergy);
 }
 }

问题是 erase_after 并出现错误信息:

In function ‘_OutputIterator std::remove_copy_if(_InputIterator, _InputIterator, 
 _OutputIterator, _Predicate) [with _InputIterator = __gnu_cxx::__normal_iterator<double*, 
std::vector<double, std::allocator<double> > >, _OutputIterator = 
__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, 
_Predicate = bool]’:
/usr/include/c++/4.2.1/bits/stl_algo.h:1302:   instantiated from ‘_ForwardIterator 
std::remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = 
__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, 
_Predicate = bool]’
Audio.cpp:105:   instantiated from here
/usr/include/c++/4.2.1/bits/stl_algo.h:1227: error: ‘__pred’ cannot be used as a function

有人知道我哪里出错了吗?

最佳答案

std::remove_if 的第三个参数是一个谓词函数(或任何可调用实体,就此而言),它采用单个元素并返回 true如果需要删除它并且 false如果不。 vector 的 vector (或您所说的“2D vector ”)的元素是一个 vector ,vector<double>在你的情况下。这就是你的谓词的参数应该是什么:

bool HasInsufficientEnergy(const vector<double>& elem)
{
    // herein is the code that tests elem and decides
    // whether it should be removed or not
}

然后是你的filter()方法不应包含比这更多的内容

void Audio::filter(vector<iniMatrix>&blocks)
{
    auto it = std::remove_if(blocks.begin(), blocks.end(), &HasInsufficientEnergy);
    blocks.erase(it, blocks.end());
}

如果您的谓词需要附加参数,则将其实现为一个将它们作为构造函数参数的类。你需要重载 operator() ,所以你有一个可调用的仿函数。 如果您的编译器支持 C++11,那么请学习如何使用 lambda 函数,因为它们对于这项任务非常有用。

关于c++ - 删除二维 vector 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13359803/

相关文章:

c++ - 在 C++ 中,使用模板根据状态更改函数调用的行为

python - 找到矢量场的幅度(长度)平方的最快方法

vector - 如何将 Vec<String> 扩展为 HashMap 值?

c++ - 按引用传递(指向对象的指针的 vector )比按值传递更快吗?

c# - 光线转换/光线追踪 : shooting rays from camera

c++ - 从串行读取但只获取最新数据

c++ - 如何以编程方式设置系统IP

c++ - Unix Qt 5.6 QSettings 找不到 QSettings::SystemScope 配置文件

C++ 列表迭代器在遍历时永远不会到达 end()

c++ - 在 C++ 中对字符 vector 进行排序并将大写和小写字母视为相等的最佳方法?