首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果使用remove_if,如何删除向量的空单元格

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

Stack Overflow用户
提问于 2015-09-15 17:37:41
回答 1查看 1.2K关注 0票数 2

我正在用某个对象填充std::向量。

在以下行中定义的向量实例:

代码语言:javascript
复制
std::vector< std::list< pcl::PointXYZRGB>> tab;

我现在要删除空单元格。我试过这样做:

代码语言:javascript
复制
tab.erase(remove_if(tab.begin(), tab.end(), std::is_empty), tab.end());

我得到了以下错误:

代码语言:javascript
复制
error: missing template arguments before ‘)’ token
     voxels.erase(remove_if(voxels.begin(), voxels.end(), is_empty**)**, voxels.end());

我很困惑,有人能告诉我怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-15 18:02:23

std::is_empty是一个性状模板。std::is_empty<X>告诉您,如果类型X是空类型--也就是说,它是一个没有任何内容的struct {}class {}

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

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

会解决你的问题。解决这个问题的一个更好的办法是:

代码语言:javascript
复制
struct container_is_empty_t {
  template<class C>
  bool operator()(C const& c)const{
    return c.empty();
  }
  // not really needed, arrays of size 0 are non-standard
  template<class T, size_t N>
  bool operator()(T(&)[N])const{
    return N > 0;
  }
};
static container_is_empty_t const container_is_empty;

在具有实用程序代码的某些头文件中,则:

代码语言:javascript
复制
tab.erase(std::remove_if(tab.begin(), tab.end(), container_is_empty), tab.end());

做同样的事情,但没有被硬编码,只在std::list< pcl::PointXYZRGB>上工作。

或在c++14

代码语言:javascript
复制
tab.erase(std::remove_if(tab.begin(), tab.end(), [](auto&& c){ return c.empty(); }, tab.end());

警告

在执行擦除成语时,如果您忘记了tab.end()部分,您将得到编译但以病态的方式做了完全错误的事情的代码。

我觉得最好

代码语言:javascript
复制
// erases elements from sequential container C if f(element) is true:
template<class C, class F>
auto erase_if( C& c, F f ) {
  using std::begin; using std::end;
  auto it = std::remove_if( begin(c), end(c), std::move(f) );
  auto sz = std::distance( it, end(c) );
  c.erase( it, end(c) );
  return sz;
}

帮手的作用,以避免这种危险。

然后你得到:

代码语言:javascript
复制
erase_if( tab, [](auto&& c){ return c.empty(); } );

又短又好。

c++20标准将std::erase_if添加到语言中。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32592351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档