gpt4 book ai didi

c++ - std::forward_list::remove_if 谓词的要求

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:41 25 4
gpt4 key购买 nike

考虑这段代码:

struct T
{
bool status;
UsefulData data;
};

std::forward_list<T> lst;

lst.remove_if([](T &x) -> bool { return x.status= !x.status; });

即一次性切换状态和删除非事件元素。

根据 cppreference上面的代码似乎是未定义的行为(强调我的):

template< class UnaryPredicate >
void remove_if( UnaryPredicate p );

p - unary predicate which returns true if the element should be removed. The signature of the predicate function should be equivalent to the following:

bool pred(const Type &a);

The signature does not need to have const &, but the function must not modify the objects passed to it. The type Type must be such that an object of type forward_list<T,Allocator>::const_iterator can be dereferenced and then implicitly converted to Type.

然而,目前的工作草案似乎限制较少(N4659 [forwardlist.ops]):

void remove(const T& value)
template <class Predicate> void remove_if(Predicate pred);

Effects:

Erases all the elements in the list referred by a list iterator i for which the following conditions hold: *i == value (for remove()), pred(*i) is true (for remove_if()). Invalidates only the iterators and references to the erased elements.

Throws:

Nothing unless an exception is thrown by the equality comparison or the predicate.

Remarks:

Stable (20.5.5.7).

Complexity:

Exactly distance(begin(), end()) applications of the corresponding predicate.

标准的其他部分是否对谓词有额外的限制?

我已经在许多编译器上测试了上面的代码,它编译并且似乎按预期工作。我真的需要遍历列表两次吗?

最佳答案

委员会的图书馆工作组刚刚搬迁 LWG issue 2998到“就绪”状态,基本上确认委员会的意图是第 28 条(算法条款)的相关要求适用于类似的列表操作。这包括 Predicate 不应用任何非常量函数的要求。

一旦通过了问题解决方案(应该在下一次委员会 session 上发生),OP 中的代码将正式具有未定义的行为。尽管如此,它通常应该按预期工作,除非有意的敌对实现。如果需要一个具有明确定义行为的实现,使用迭代器和 erase_after 手动编写一个并不难。

关于c++ - std::forward_list::remove_if 谓词的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44965206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com