在C++标准库中,std::move_iterator是一种迭代器适配器,它能够将底层的普通迭代器包装起来,使得通过它解引用得到的不是元素的左值引用,而是右值引用。这样在配合泛型算法使用时,算法会自动以移动而非拷贝的方式处理元素,从而减少不必要的内存复制开销。

什么是std::move_iterator
std::move_iterator定义在<iterator>头文件中,模板参数是一个基础迭代器类型。它的核心作用是重载解引用运算符,返回std::move(*base_iterator)的结果。我们可以用std::make_move_iterator辅助函数快速创建移动迭代器。
基本定义方式
#include <iterator>
#include <vector>
#include <string>
std::vector<std::string> src = {"a", "b", "c"};
// 将普通迭代器包装为移动迭代器
auto begin = std::make_move_iterator(src.begin());
auto end = std::make_move_iterator(src.end());
在算法中自动移动元素
最常见的用法是把std::move_iterator作为算法的输入区间,把普通迭代器作为输出区间。这样算法在读取源元素时会自动移动它们。
使用std::copy转移容器内容
下面示例将源容器的字符串移动到目标容器,源元素之后会处于有效但未指定状态:
#include <algorithm>
#include <iterator>
#include <vector>
#include <string>
#include <iostream>
int main() {
std::vector<std::string> src = {"hello", "world"};
std::vector<std::string> dst;
dst.reserve(src.size());
// 用move_iterator作为输入,自动移动元素
std::copy(std::make_move_iterator(src.begin()),
std::make_move_iterator(src.end()),
std::back_inserter(dst));
for (const auto& s : dst) {
std::cout << s << " ";
}
// src中的元素已被移动,不应再依赖其内容
return 0;
}
注意事项
- 被移动的元素处于有效但未指定状态,通常只能赋值或销毁,不要假设其原值。
- 移动迭代器不适用于只读算法之外的场景,比如排序算法可能会破坏源序列。
- 若元素类型没有可用的移动构造函数,则行为退化为拷贝。
与其他算法的配合
除了std::copy,std::move_iterator也可以用于std::transform等算法。例如将源容器元素移动并转换为大写:
#include <algorithm>
#include <iterator>
#include <vector>
#include <string>
#include <cctype>
std::vector<std::string> src = {"ab", "cd"};
std::vector<std::string> out;
out.reserve(src.size());
std::transform(std::make_move_iterator(src.begin()),
std::make_move_iterator(src.end()),
std::back_inserter(out),
[](std::string s) {
for (auto& c : s) c = std::toupper(c);
return s;
});
小结
std::move_iterator是C++标准库提供的轻量工具,能让算法自动以移动语义处理元素。在容器间批量转移、拼接等场景中,配合std::copy或std::transform可显著简化代码并提升性能。使用时只需注意源元素移动后的状态即可。
std_move_iteratorC++算法移动元素修改时间:2026-07-26 09:15:19