我有一个对象的std::list。该列表已排序,必须保持不变。我需要找到那些满足某个条件(我有一个谓词)的对象,将它们传递给一个函数,然后从列表中删除这些对象。
编写循环调用std::find_if(),对其结果(如果有)执行操作,调用list.erase(),并将其结果作为begin迭代器传递给下一个std::find_if()的调用并不太难。然而,人们通常发现这样的代码比编写它更难读懂。
因此,我更愿意使用一些std lib中的算法,而不是编写自己的循环。
一个想法是(滥用)std::list<>::remove_if():在谓词匹配的元素上调用操作,直到返回true,以便列表将删除元素。这符合标准吗?(项目本身不会改变,只有它们引用的数据。)
或者你能想出更好的解决方案吗?(再次强调,主要目标是使其易于阅读和理解。)也许是因为我刚遇到这个问题,但对我来说,这似乎不是对象序列的一个不常见的使用模式。
注:暂时我们还停留在C++03领域。:-/ C++11/14/17的解决方案很有趣,因此欢迎,但我确实需要一些可以在C++03中使用的东西。
编写循环调用std::find_if(),对其结果(如果有)执行操作,调用list.erase(),并将其结果作为begin迭代器传递给下一个std::find_if()的调用并不太难。然而,人们通常发现这样的代码比编写它更难读懂。
因此,我更愿意使用一些std lib中的算法,而不是编写自己的循环。
一个想法是(滥用)std::list<>::remove_if():在谓词匹配的元素上调用操作,直到返回true,以便列表将删除元素。这符合标准吗?(项目本身不会改变,只有它们引用的数据。)
或者你能想出更好的解决方案吗?(再次强调,主要目标是使其易于阅读和理解。)也许是因为我刚遇到这个问题,但对我来说,这似乎不是对象序列的一个不常见的使用模式。
注:暂时我们还停留在C++03领域。:-/ C++11/14/17的解决方案很有趣,因此欢迎,但我确实需要一些可以在C++03中使用的东西。
for_each
,在执行期间将迭代器存储在某个地方,并在最后删除这些元素。 - skypjackstd::list
,对吗? - skypjackremove_if()
” - 显然你没有写。不过,我刚刚遇到了std::stable_partition()
,看起来正是我需要的东西。 - sbi