如何使用 lambda 擦除空向量单元格?

Posted

技术标签:

【中文标题】如何使用 lambda 擦除空向量单元格?【英文标题】:How to use lambda to erase empty vector cells? 【发布时间】:2013-09-08 07:30:37 【问题描述】:

我有一个向量:

std::vector<Edge> edges(num);

最后包含空单元格,我想使用 lambda 将其删除,但当我这样做时:

edges.erase(std::remove_if(edges.begin(), edges.end(), 
                       std::mem_fn(&std::Edge::empty), edges.end() );

我收到了这个错误:

error C2664: 'bool main::<lambda_6f33349b59d49f69703a5fa6a8c5995a>::operator ()(const std::vector<_Ty> &) const' : cannot convert parameter 1 from 'Edge' to 'const std::vector<_Ty> &'

我现在该怎么办?

【问题讨论】:

我认为 std 中没有 std::Edge::empty 函数。 【参考方案1】:

如何使用 lambda 擦除空向量单元格?

您只需要提供一个简单的 lambda,如果 Edge 为空,则返回 true:

edges.erase(std::remove_if(edges.begin(), 
                           edges.end(), 
                           [](const Edge& e)return e.empty();), 
            edges.end() );

这假设Edge有一个合适的成员函数empty()

class Edge

 public:

  bool empty() const  .... 

  // as before
;

【讨论】:

我尝试了上面的代码,我的编译显示'error C2039 empty is not a member of Edge' @Napalidon 好吧,我从您的原始代码中猜到 Edge 有一个 empty 方法,因为您似乎正在尝试调用它。什么方法告诉你Edge 是否为空? 我没有。我该怎么写?只需检查所有实例变量是否为0?而我只是返回真实?或者我可以继承它吗? @Napalidon 如果你不知道Edge 是空的,那么你不能删除空的Edges。如果你不知道它们是否为空,那么它们是否是空的应该没有什么区别。您必须弄清楚“空”是什么意思,然后提供一种对其进行测试的方法。 Edge 是您自己定义的类,不是吗?只需编写一个 empty 方法来检查它是否符合您的“空”标准。

以上是关于如何使用 lambda 擦除空向量单元格?的主要内容,如果未能解决你的问题,请参考以下文章

lambda()函数如何同时判断两个单元格的值分别满足各自给定值怎么做?

如何在Mexfile中的matlab(矩阵,单元格)和c ++(向量或自定义类)之间正确转换变量

在 Matlab 中访问单元格中的向量

从向量中最快擦除元素或更好地使用内存(排序基数)

如何擦除双循环中的向量元素

vba如何对选取区域设置边框线颜色,边框包括外部边框和内部的。