#include <iostream> #include <vector> #include <list> #include <string> using namespace std; int main() { //建立並初始化一個 vector 容器 vector<string> myvec{ "STL","Python","Java" }; //再次建立一個 vector 容器,利用 myvec 為其初始化 vector<string>othvec(myvec.begin(), myvec.end()); cout << "myvec:" << endl; //輸出 myvec 容器中的元素 for (auto ch : myvec) { cout << ch << " "; } cout << endl << "othvec:" << endl; //輸出 othvec 容器中的元素 for (auto ch : othvec) { cout << ch << " "; } return 0; }程式執行結果為:
myvec:
STL Python Java
othvec:
STL Python Java
#include <iterator> using namespace std;第二行程式碼不是必需的,但如果不用,則程式中在建立該型別的疊代器時,必須手動注明 std 名稱空間(強烈建議初學者使用)。
template <class Iterator> class move_iterator;可以看到,在使用此迭代器時,需要傳入一個基礎疊代器 Iterator。
實際上,在 move_iterator 模板類中就包含有指定 Iterator 型別的基礎疊代器,整個模板類也是借助此基礎疊代器實現的。關於 move_iterator 的底層實現,C++ STL move_iterator手冊給出了詳細的參考程式碼,有興趣的讀者可自行研究。
//將 vector 容器的隨機存取疊代器作為新建移動迭代器底層使用的基礎疊代器 typedef std::vector<std::string>::iterator Iter; //呼叫預設建構函式,建立移動迭代器 std::move_iterator<Iter>mIter;
由此,我們就建立好了一個 mIter 移動迭代器,該疊代器底層使用的是 vector 容器的隨機存取疊代器,但這裡沒有為此基礎疊代器明確指向,所以 mIter 疊代器也不知向任何物件。如果程式中引入了 std 名稱空間,則上面程式碼中所有的 std:: 都可以省略。
//建立一個 vector 容器 std::vector<std::string> myvec{ "one","two","three" }; //將 vector 容器的隨機存取疊代器作為新建移動迭代器底層使用的基礎疊代器 typedef std::vector<std::string>::iterator Iter; //建立並初始化移動迭代器 std::move_iterator<Iter>mIter(myvec.begin());這裡,我們建立了一個 mIter 移動迭代器,同時還為底層使用的隨機存取疊代器做了初始化,即令其指向 myvec 容器的第一個元素。
std::move_iterator<Iter>mIter2(mIter); //還可以使用 = 運算子,它們是等價的 //std::move_iterator<Iter>mIter2 = mIter;這樣建立的 mIter2 疊代器和 mIter 疊代器完全一樣。也就是說,mIter2 底層會複製 mIter 疊代器底層使用的基礎疊代器。
template <class Iterator>
move_iterator<Iterator> make_move_iterator (const Iterator& it);
typedef std::vector<std::string>::iterator Iter; std::vector<std::string> myvec{ "one","two","three" }; //將 make_move_iterator() 的返回值賦值給同型別的 mIter 疊代器 std::move_iterator<Iter>mIter = make_move_iterator(myvec.begin());下面程式對程式一做了修改,即運用移動迭代器為 othvec 容器初始化:
#include <iostream> #include <vector> #include <list> #include <string> using namespace std; int main() { //建立並初始化一個 vector 容器 vector<string> myvec{ "STL","Python","Java" }; //再次建立一個 vector 容器,利用 myvec 為其初始化 vector<string>othvec(make_move_iterator(myvec.begin()), make_move_iterator(myvec.end())); cout << "myvec:" << endl; //輸出 myvec 容器中的元素 for (auto ch : myvec) { cout << ch << " "; } cout << endl << "othvec:" << endl; //輸出 othvec 容器中的元素 for (auto ch : othvec) { cout << ch << " "; } return 0; }程式執行結果為:
myvec:
othvec:
STL Python Java
注意,即便通過移動迭代器將容器中某區域的元素移動到了其他容器中,該區域內仍可能殘留有之前儲存的元素,但這些元素是不能再被使用的,否則極有可能使程式產生各種其他錯誤。
#include <iostream> #include <vector> #include <list> #include <string> using namespace std; int main() { typedef std::vector<std::string>::iterator Iter; //建立並初始化一個 vector 容器 vector<std::string> myvec{ "STL","Java","Python" }; //建立 2 個移動迭代器 std::move_iterator<Iter>begin = make_move_iterator(myvec.begin()); std::move_iterator<Iter>end = make_move_iterator(myvec.end()); //以複製的方式初始化 othvec 容器 vector <std::string> othvec(begin.base(), end.base()); cout << "myvec:" << endl; //輸出 myvec 容器中的元素 for (auto ch : myvec) { cout << ch << " "; } cout << endl << "othvec:" << endl; //輸出 othvec 容器中的元素 for (auto ch : othvec) { cout << ch << " "; } return 0; }程式執行結果為:
myvec:
STL Java Python
othvec:
STL Java Python