为什么不能使用std :: remove_if从std :: set中删除字符串?

为什么不能使用std :: remove_if从std :: set中删除字符串?,第1张

为什么不能使用std :: remove_if从std :: set中删除字符串?

std::remove_if
(或
std::erase
)通过重新分配范围成员的值来工作。它不了解如何
std::set
组织数据,或如何从内部树数据结构中删除节点。确实,如果没有
set
对象本身,仅使用对节点的引用是不可能的。

标准算法设计为具有透明(或至少始终易于记忆)的计算复杂性。

set
由于需要重新平衡树,因此有选择地从a中删除元素的函数为O(N log
N),这比循环调用更好
my_set.remove()
。因此,该标准未提供它,而这正是您需要编写的。

另一方面,天真地手工编码的循环(一个接一个地删除项)

vector
将是O(N ^
2),而是
std::remove_if
O(N)。因此,在这种情况下,图书馆确实提供了切实的利益。

典型的循环(C ++ 03样式):

for ( set_t::iterator i = my_set.begin(); i != my_set.end(); ) {    if ( condition ) {        my_set.erase( i ++ ); // strict C++03        // i = my_set.erase( i ); // more modern, typically accepted as C++03    } else {        ++ i; // do not include ++ i inside for ( )    }}

编辑(4年后!):

i++
在那里看起来可疑。如果在后增量运算符可以更新它之前使它
erase
无效怎么
i
办?不过,这很好,因为它是重载
operator++
而不是内置的运算符。该函数安全地
i
就地更新,
然后 返回其原始值的副本。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5620173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存