如何使用 Boost lambda 将 remove_if 与 UUID 比较应用?

Posted

技术标签:

【中文标题】如何使用 Boost lambda 将 remove_if 与 UUID 比较应用?【英文标题】:How do I apply remove_if with a UUID comparison, using Boost lambdas? 【发布时间】:2014-04-14 21:10:39 【问题描述】:

我有一个 UUID 的列表。我想删除列表中具有给定 UUID 的元素。我的问题是,如何实现这一点,使用 boost lambdas 和 std::list::remove_if 方法,这样我就不必在外部编写比较函数了。

【问题讨论】:

我会采用Nair 的方法,并且非常小心。 为什么不只是list.remove(the_uuid) 【参考方案1】:

如果您的容器是std::list,那么您有成员函数 std::list::remove()std::list::remove_if()

既然boost::Uuid已经实现了一个比较operator==(),那么你可以简单的做:

std::list<boost::Uuid> uuids;
...
uuids.remove(uuidToRemove);

【讨论】:

【参考方案2】:

Boost UUID 具有可比性并提供比较运算符。当您知道 UUID 时,您可以使用 std::remove。

std::vector<boost::Uuid> uuids = /* ... */;
boost::Uuid toRemove;
uuids.erase( std::remove(uuids.begin(), uuids.end(), toRemove), uuids.end() );

如果你愿意,你可以使用 boost bind 来修复一个参数

bool cmp(boost::Uuid const& x, boost::Uuid const& y) return x == y;
uuids.erase( std::remove_if(uuids.begin(), 
                            uuids.end(), 
                            boost::bind(cmp, toRemove, _2) )
              uuids.end() );

【讨论】:

std::remove 返回一个迭代器,您不能将它分配给 vector。此外,您在一致使用 boost 类型方面存在问题。另外,OP 使用的是std::list,它有removeremove_if 是的,返回类型的分配有错误。谢谢。但是你对“始终使用 boost 类型的问题有什么看法? 我的意思是 Uuiduuid,你现在已经修复了。为了真正从vector 中删除元素,对remove 的调用应该由vector::erase 完成。不过,std::list 并不需要所有这些。 好的,这只是一个错字。我忽略了他确实有一个 std::list 类型(我几乎总是建议不要使用 std::list 而是使用 std::vector)。我还添加了对 std::erase 的调用,以防有人稍后阅读答案。

以上是关于如何使用 Boost lambda 将 remove_if 与 UUID 比较应用?的主要内容,如果未能解决你的问题,请参考以下文章

std::remove 和 boost::filesystem::remove 之间的区别?

正确使用 boost lambda

boost中Function和Lambda的使用

boost::interprocess::shared_memory_object::remove 失败

提升 named_mutex 和 remove() 命令

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