gpt4 book ai didi

c++ - 为什么没有 std::move_if 算法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:43 27 4
gpt4 key购买 nike

我在 Internet 上看到一些地方描述了将 std::copy_ifstd::make_move_iterator 一起使用,但是如果迭代器是前向的迭代器,这将导致在源容器周围散布有效但未指定 (VBU) 的对象。

如果有一个 std::move_if 算法会不会更好,如果一个对象被移动,那么它会将生成的 VBU 对象移动到范围的末尾,就像那个是在 std::remove_if 算法中完成的,将所有 VBU 对象合并在一起,以便它们可以被删除或重新分配?

最佳答案

如果 move_if 作为算法存在,则必须指定为:

template <class InputIt, class OutputIt, class UnaryPredicate>
OutputIt move_if(InputIt first, InputIt last, OutputIt d_first, UnaryPredicate pred)
{
return std::copy_if(std::make_move_iterator(first), std::make_move_iterator(last),
d_first, pred);
}

我们习惯于将复制和移动之间的区别简单地看作是我们是否关心源对象的问题。我们还做吗?复制。我们不?移动。让 move_if(f, l, d, pred) 做一些与 copy_if(f, l, d, pred) 在语义上不同的事情似乎本质上令人困惑并且容易出错——因为它不可避免的用法是“在我们不再关心源代码的地方进行复制”。

但是,您或多或少地在问题中描述了该算法的问题。我什么时候用这个?我最终会得到一个源范围,其中一些元素被移出但其他元素没有。我能用这样的范围做什么?我无法以某种方式合并它们,因为我不知道它们是哪些或任何东西。将这些元素移到后面很有用 - 我们确实有这样的算法:remove_if

此时基本上我唯一能对源范围做的就是销毁它。也许这很有用。也许这足够有用,甚至值得在 std:: 中使用该算法。我不知道。但是 move_if 肯定需要做与 copy_if 相同的事情。

关于c++ - 为什么没有 std::move_if 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55502720/

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