移动范围的算法存在吗?

5
在C++98中,我可以使用std::copy算法复制范围。
std::copy(source.begin(), source.end(), destination.begin());

在C++0x中是否有一种算法可以将元素从源位置移动到目标位置?或者std::copy是否被重载以接受类似rvalue迭代器的东西——这样的东西是否真的存在呢?

这个算法可能长这样:

#include <utility>

template<class InputIterator, class OutputIterator>
OutputIterator mooove(InputIterator first, InputIterator last, OutputIterator result)
{
    for (; first != last; ++first, ++last) *result = std::move(*first);
    return result;
}

对于范围内的每个元素,调用移动赋值运算符operator=(T&&)而不是复制赋值运算符operator=(const T&) - fredoverflow
所以算法会改变源范围,而不是复制——它会“剪切”元素? - Idan K
1
是的,它有可能会摧毁源元素。这就是C++0x中移动操作的工作原理。 - fredoverflow
3个回答

5

看起来在最新的草案中有提到(请参见25.3.2节)。

我有一份C++03的硬拷贝,它与C++98完全相同(25.2.x节),您可以看到相同的算法(显然没有“move”)。


2

此外还有一个迭代器适配器std::move_iterator,可以用来适应任何复制元素的范围算法以移动元素。 std::move(first, last, dest)只是最常见用例的便利包装器--在语义上等同于std::copy(std::move_iterator(first), std::move_iterator(last), dest)


啊,原来确实有“rvalue迭代器”这个东西 :) - fredoverflow

0

仅仅因为这个页面现在有点混乱... 这里有一个 std::move( first, last, dest ),OP只是被旧的C++0x草案所迷惑了。该函数由第25.3.2节定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接