std::move_iterator 是在 C++11 中引入的,能够将常规迭代器转换为移动迭代器。 std::move_iterator 允许 STL 移动其操作的对象,而不是复制。移动迭代器包装另一个迭代器。这在处理大量信息设计或可以移动但无法有效复制的项目时特别有用。
用法
要从现有容器的迭代器创建移动迭代器,我们使用 make_move_iterator() 函数,如下所示:
move_iterator <container<T>::iterator> itr = make_move_iterator( container<T>:::iterator );
这里,
- <容器<T>:::迭代器>:它指定move_iterator的模板参数。在这种情况下,它指定了迭代器的类型my_move_iterator将包装可以迭代向量的元素。
- make_move_iterator:构造 std::的函数模板move_iterator对于给定的迭代器。
示例 1:将所有元素从源移动到目标
前:
Source Vector = {1, 2, 3, 4, 5}
Destination Vector = {}
后:
Source Vector = {}
Destination Vector = {1, 2, 3, 4, 5}
示例 2:从源向量的中间移动元素
前:
Source Vector = {1, 2, 3, 4, 5}
Destination Vector = {}
后:
Source Vector = {1, 2}
Destination Vector = {3, 4, 5}
实现 std::move_iterator 的 C++ 程序
让我们探索一个基本示例来了解 std::move_iterator 的工作原理:
C++
// C++ Program to implement move_iterator
#include <bits/stdc++.h>
using namespace std;
int main()
{
// source vector
vector<string> v1 = { "Hi", "Geeks", "for", "Geeks" };
// destination vector
vector<string> v2;
cout << "Before move iterator\n";
cout << "Source: ";
for (auto s : v1) {
cout << s << ' ';
}
cout << endl;
cout << "Destination: ";
for (auto s : v2) {
cout << s << ' ';
}
cout << endl;
// using std::copy to copy elements from one vector to
// another
copy(make_move_iterator(begin(v1)),
make_move_iterator(end(v1)), back_inserter(v2));
cout << "\nAfter move iterator\n";
cout << "Source: ";
for (auto s : v1) {
cout << s << ' ';
}
cout << endl;
cout << "Destination: ";
for (auto s : v2) {
cout << s << ' ';
}
cout << endl;
return 0;
}
输出
Before move iterator Source: Hi Geeks for Geeks Destination: After move iterator Source: Destination: Hi Geeks for Geeks
在此代码中:
- 我们创建一个带有一些初始值的向量<string> v1。
- 创建一个新向量 v2 来存储移动的元素。
- 我们使用 std::copy 通过移动迭代器有效地将元素的所有权从 v1 转移到 v2。
- 移动后,v1 为空,因为其元素的所有权已转移。
- 最后,我们打印两个向量的内容来验证结果。
何时使用 std::move_iterator?
您应该考虑在以下场景中使用 std::move_iterator:
- 优化内存使用:当您需要将元素从一个容器传输到另一个容器同时最大限度地减少内存开销时。
- 性能提升:当您想通过避免不必要的元素复制来提高性能时。
- 具有移动语义的容器:当您使用支持移动语义的容器(例如 std::vector)时。使用 std::move_iterator 的 C++ 程序。
相关用法
- C++11 std::initializer_list用法及代码示例
- C++17 std::clamp用法及代码示例
- C++17 std::lcm用法及代码示例
- C++17 std::variant用法及代码示例
- C++14 std::integer_sequence用法及代码示例
- C++14 std::quoted用法及代码示例
- C++17 std::cyl_bessel_i用法及代码示例
- C++14 std::make_unique用法及代码示例
- C++ cos()用法及代码示例
- C++ sin()用法及代码示例
- C++ asin()用法及代码示例
- C++ atan()用法及代码示例
- C++ atan2()用法及代码示例
- C++ acos()用法及代码示例
- C++ tan()用法及代码示例
- C++ sinh()用法及代码示例
- C++ ceil()用法及代码示例
- C++ tanh()用法及代码示例
- C++ fmod()用法及代码示例
- C++ acosh()用法及代码示例
- C++ asinh()用法及代码示例
- C++ floor()用法及代码示例
- C++ atanh()用法及代码示例
- C++ log()用法及代码示例
- C++ trunc()用法及代码示例
注:本文由纯净天空筛选整理自shivangi2707大神的英文原创作品 std::move_iterator in C++ 11。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。