如果使用remove_if,如何删除向量的空单元格

时间:2015-09-15 17:37:42

标签: c++ c++11 vector erase remove-if

我正在用一些对象填充std :: vector。

此向量实例,如以下行所定义:

std::vector< std::list< pcl::PointXYZRGB>> tab;

我现在要删除空单元格。我尝试过如下:

tab.erase(remove_if(tab.begin(), tab.end(), std::is_empty), tab.end());

我收到以下错误:

error: missing template arguments before ‘)’ token
     voxels.erase(remove_if(voxels.begin(), voxels.end(), is_empty**)**, voxels.end());

我很困惑,有人可以告诉我我该怎么做吗?

1 个答案:

答案 0 :(得分:4)

std::is_empty是一个特征模板。 std::is_empty<X>告诉您类型 X是否为空类型 - 也就是说,它是struct {}class {} 在里面

这不是你想要的。首先,因为它不能被称为你需要它被调用的方式 - 它没有operator()对你有用 - 其次,它需要一个类型,而不是一个类型的实例,并回答问题关于类型,而不是实例。

auto list_is_empty = [](std::list< pcl::PointXYZRGB> const& l) {
  return l.empty();
};
tab.erase(remove_if(tab.begin(), tab.end(), list_is_empty), tab.end());

将解决您的问题。解决问题的更好方法是:

struct container_is_empty_t {
  template<class C>
  bool operator()(C const& c)const{
    return c.empty();
  }
  template<class T, size_t N>
  bool operator()(T(&)[N])const{
    return N > 0;
  }
};
static container_is_empty_t const container_is_empty;

在一些带有实用程序代码的头文件中,然后:

tab.erase(remove_if(tab.begin(), tab.end(), container_is_empty), tab.end());

执行相同的操作,但没有硬编码只能在std::list< pcl::PointXYZRGB>上工作。