gpt4 book ai didi

c++ - 删除 std::forward_list 中的单个元素——prev_it=it 或++prev_it?

转载 作者:行者123 更新时间:2023-11-30 01:25:38 29 4
gpt4 key购买 nike

假设我有一个类似std::forward_list 的单向链表。我想找到一个匹配谓词的单个列表元素,对其执行一些操作并根据另一个谓词选择性地删除它。

到目前为止,我已经收集了以下内容:

for (T::iterator it = l.begin(), prev_it = l.before_begin();
it != l.end();)
{
if (predicate)
{
// ...

if (another_predicate)
{
l.erase_after(prev_it);
break;
}
}

prev_it = it;
++it;
}

但是,我特别想知道这是否是执行增量部分的最佳方式。或者,我一直在考虑:

    ++prev_it;
++it;

虽然在纯 C 中前者显然更好,但在 C++ 中似乎不再那么清楚了。我相信使用更简单的迭代器,前者应该更简单;然而,如果复制迭代器可能涉及内存分配(例如,当使用 PImpl 时),后者实际上可能更好。

您认为哪种方法更好,为什么?请注意,我想避免将其严格限制在常见的 std::forward_list 设计中,并考虑一种适用于更复杂类型的解决方案。

最佳答案

当 for 循环不递增它们的计数器时,我真的很困惑,所以我只是将 ++prev_it,++it 添加到您的 for 循环中。您的迭代器将保持一致(前提是您不弄乱它们)并且名称清楚地说明了它们所指的内容。在担心性能之前,我总是在清晰度方面犯错误。

您可能不必担心将此代码推广到其他容器,因为 std::forward_list 是一个特例。其他容器不需要像 erase_after 这样的东西。

关于c++ - 删除 std::forward_list 中的单个元素——prev_it=it 或++prev_it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12010156/

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