std::move_iterator

< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器原语
算法概念与工具
间接可调用概念
常用算法要求
工具
迭代器适配器
流迭代器
迭代器定制点
迭代器操作
(C++11)
(C++11)
范围访问
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
 
定义于头文件 <iterator>
template< class Iter >
class move_iterator;
(C++11 起)

std::move_iterator 是准确表现为底层迭代器(必须至少是一个遗留输入迭代器 (LegacyInputIterator) 或实现 input_iterator (C++20 起))的迭代器适配器,除了解引用会将底层迭代器返回的值转换为右值。若此迭代器用作输入迭代器,则效果是值被移动,而非复制。

成员类型

 
成员类型 定义
iterator_type Iter
iterator_category

std::iterator_traits<Iter>::iterator_category

(C++20 前)

std::iterator_traits<Iter>::iterator_category 实现 std::derived_from<std::random_access_iterator_tag> 则为 std::random_access_iterator_tag 。否则为不更改的 std::iterator_traits<Iter>::iterator_category

(C++20 起)
iterator_concept
(C++20 起)
std::input_iterator_tag
value_type

std::iterator_traits<Iter>::value_type

(C++20 前)

std::iter_value_t<Iter>

(C++20 起)
difference_type

std::iterator_traits<Iter>::difference_type

(C++20 前)

std::iter_difference_t<Iter>

(C++20 起)
pointer Iter
reference

std::iterator_traits<Iter>::reference 为引用,则为同一类型的右值引用版本。否则(例如若包装的迭代器以值返回)为不更改的 std::iterator_traits<Iter>::reference

(C++20 前)

std::iter_rvalue_reference_t<Iter>

(C++20 起)

成员函数

构造新的迭代器适配器
(公开成员函数)
赋值另一迭代器
(公开成员函数)
访问底层迭代器
(公开成员函数)
(C++20 中弃用)
访问指向的元素
(公开成员函数)
按索引访问元素
(公开成员函数)
推进或回退迭代器
(公开成员函数)

成员对象

 
成员名称 定义
current (私有成员对象) base() 迭代器的副本,名称仅为说明

非成员函数

比较底层迭代器
(函数模板)
比较底层迭代器与底层哨位
(函数模板)
令迭代器前进
(函数模板)
计算两个迭代器适配器间的距离
(函数模板)
计算底层迭代器与底层哨位间的距离
(函数模板)
(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 能返回悬垂引用 替而返回对象

参阅

创建拥有从实参推出的类型的 std::move_iterator
(函数模板)
用于 std::move_iterator 的哨位适配器
(类模板)