std::move_iterator
定义于头文件 <iterator>
|
||
template< class Iter > class move_iterator; |
(C++11 起) | |
std::move_iterator
是准确表现为底层迭代器(必须至少是一个遗留输入迭代器 (LegacyInputIterator) 或实现 input_iterator (C++20 起))的迭代器适配器,除了解引用会将底层迭代器返回的值转换为右值。若此迭代器用作输入迭代器,则效果是值被移动,而非复制。
成员类型
成员类型 | 定义 | ||||
iterator_type
|
Iter
| ||||
iterator_category
|
| ||||
iterator_concept (C++20 起) |
std::input_iterator_tag | ||||
value_type
|
| ||||
difference_type
|
| ||||
pointer
|
Iter
| ||||
reference
|
|
成员函数
构造新的迭代器适配器 (公开成员函数) | |
赋值另一迭代器 (公开成员函数) | |
访问底层迭代器 (公开成员函数) | |
(C++20 中弃用) |
访问指向的元素 (公开成员函数) |
按索引访问元素 (公开成员函数) | |
推进或回退迭代器 (公开成员函数) |
成员对象
成员名称 | 定义 |
current (私有成员对象)
|
base() 迭代器的副本,名称仅为说明 |
非成员函数
(C++20 中移除)(C++20) |
比较底层迭代器 (函数模板) |
比较底层迭代器与底层哨位 (函数模板) | |
令迭代器前进 (函数模板) | |
计算两个迭代器适配器间的距离 (函数模板) | |
计算底层迭代器与底层哨位间的距离 (函数模板) | |
(C++20) |
转型解引用底层迭代器的结果为其所关联的右值引用类型 (函数模板) |
(C++20) |
交换二个底层迭代器所指向的对象 (函数模板) |
示例
运行此代码
#include <iostream> #include <algorithm> #include <vector> #include <iterator> #include <numeric> #include <string> int main() { std::vector<std::string> v{"this", "is", "an", "example"}; std::cout << "Old contents of the vector: "; for (auto& s : v) std::cout << '"' << s << "\" "; typedef std::vector<std::string>::iterator iter_t; std::string concat = std::accumulate( std::move_iterator<iter_t>(v.begin()), std::move_iterator<iter_t>(v.end()), std::string()); // 可用 std::make_move_iterator 简化 std::cout << "\nConcatenated as string: " << concat << '\n' << "New contents of the vector: "; for (auto& s : v) std::cout << '"' << s << "\" "; std::cout << '\n'; }
可能的输出:
Old contents of the vector: "this" "is" "an" "example" Concatenated as string: thisisanexample New contents of the vector: "" "" "" ""
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2106 | C++11 | 若解引用底层迭代器返回纯右值则解引用 move_iterator 能返回悬垂引用
|
替而返回对象 |
参阅
(C++11) |
创建拥有从实参推出的类型的 std::move_iterator (函数模板) |
(C++20) |
用于 std::move_iterator 的哨位适配器 (类模板) |