std::move

来自cppreference.com
< cpp‎ | algorithm

 
 
算法库
执行策略 (C++17)
不修改的序列操作
(C++11)
(C++11)
(C++11)
(C++17)
修改的序列操作
(C++11)
move
(C++11)

未初始化存储上的操作
划分操作
排序操作
(C++11)
二分查找操作
集合操作(在已排序范围上)
堆操作
(C++11)
最小/最大操作
(C++11)
(C++17)

重排
数值操作
C 库
 
定义于头文件 <algorithm>
template< class InputIt, class OutputIt >
OutputIt move( InputIt first, InputIt last, OutputIt d_first );
(C++11 起)
移动的范围[first, last)中的元素,到另一个范围开始于d_first。此操作后,移离范围中的元素将包含有效的数值适当类型的,但不一定是相同的值前移到.
原文:
Moves the elements in the range [first, last), to another range beginning at d_first. After this operation the elements in the moved-from range will still contain valid values of the appropriate type, but not necessarily the same values as before the move.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

目录

[编辑] 参数

first, last -
的范围内移动的元素
原文:
the range of elements to move
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
d_first -
的目标范围的开头。如果d_first[first, last)std::move_backward必须使用代替NJ的std ::移动</ span>.
原文:
the beginning of the destination range. If d_first is within [first, last), std::move_backward must be used instead of 的std::move.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
</div>
类型要求
-
InputIt 必须满足 InputIterator 的要求。
-
OutputIt 必须满足 OutputIterator 的要求。

[编辑] 返回值

过去的最后一个元素的元素的输出迭代器的移动(d_first + (last - first)
原文:
Output iterator to the element past the last element moved (d_first + (last - first))
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 复杂度

究竟last - first移动作业.
原文:
Exactly last - first move assignments.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 可能的实现

template<class InputIt, class OutputIt>
OutputIt move(InputIt first, InputIt last, 
                    OutputIt d_first)
{
    while (first != last) {
        *d_first++ = std::move(*first++);
    }
    return d_first;
}

[编辑] 示例

下面的代码将线程对象(它们本身并不能被拷贝)从一个容器移动到另一个容器。
原文:
The following code moves thread objects (which themselves are not copyable) from one container to another.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <thread>
#include <chrono>
 
void f(int n)
{
    std::this_thread::sleep_for(std::chrono::seconds(n));
    std::cout << "thread " << n << " ended" << '\n';
}
 
int main() 
{
    std::vector<std::thread> v;
    v.emplace_back(f, 1);
    v.emplace_back(f, 2);
    v.emplace_back(f, 3);
    std::list<std::thread> l;
    // copy() would not compile, because std::thread is noncopyable
    std::move(v.begin(), v.end(), std::back_inserter(l)); 
    for(auto& t : l) t.join();
}

输出:

thread 1 ended
thread 2 ended
thread 3 ended

[编辑] 另请参阅

按从后往前的顺序移动某一范围的元素到新的位置
(函数模板) [编辑]