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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。