【发布时间】:2014-04-14 21:10:39
【问题描述】:
我有一个 UUID 的列表。我想删除列表中具有给定 UUID 的元素。我的问题是,如何实现这一点,使用 boost lambdas 和 std::list::remove_if 方法,这样我就不必在外部编写比较函数了。
【问题讨论】:
-
我会采用Nair 的方法,并且非常小心。
-
为什么不只是
list.remove(the_uuid)?
我有一个 UUID 的列表。我想删除列表中具有给定 UUID 的元素。我的问题是,如何实现这一点,使用 boost lambdas 和 std::list::remove_if 方法,这样我就不必在外部编写比较函数了。
【问题讨论】:
list.remove(the_uuid)?
如果您的容器是std::list,那么您有成员函数 std::list::remove() 和std::list::remove_if()。
既然boost::Uuid已经实现了一个比较operator==(),那么你可以简单的做:
std::list<boost::Uuid> uuids;
...
uuids.remove(uuidToRemove);
【讨论】:
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,它有remove 和remove_if。
Uuid 与 uuid,你现在已经修复了。为了真正从vector 中删除元素,对remove 的调用应该由vector::erase 完成。不过,std::list 并不需要所有这些。