日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

auto与迭代器的用法_C++ STL move_iterator移动迭代器用法详解

發(fā)布時(shí)間:2023/12/19 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 auto与迭代器的用法_C++ STL move_iterator移动迭代器用法详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C++ 11 還為 STL 標(biāo)準(zhǔn)庫(kù)增添了一種迭代器適配器,即本節(jié)要講的 move_iterator 移動(dòng)迭代器適配器。

move_iterator 迭代器適配器,又可簡(jiǎn)稱為移動(dòng)迭代器,其可以實(shí)現(xiàn)以移動(dòng)而非復(fù)制的方式,將某個(gè)區(qū)域空間中的元素移動(dòng)至另一個(gè)指定的空間。

#include #include #include #include using namespace std;int main(){ //創(chuàng)建并初始化一個(gè) vector 容器 vector myvec{ "STL","Python","Java" }; //再次創(chuàng)建一個(gè) vector 容器,利用 myvec 為其初始化 vectorothvec(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;}

程序執(zhí)行結(jié)果為:

myvec:STL Python Javaothvec:STL Python Java

注意程序第 11 行,初始化 othvec 容器是通過(guò)復(fù)制 myvec 容器中的元素實(shí)現(xiàn)的。也就是說(shuō),othvec 容器從 myvec 容器中復(fù)制了一份 "STL"、"Python"、"Java" 并存儲(chǔ)起來(lái),此過(guò)程不會(huì)影響 myvec 容器。

那么,如果不想采用復(fù)制的方式,而就是想 myvec 容器中存儲(chǔ)的元素全部移動(dòng)到 othvec 容器中,該怎么辦呢?沒錯(cuò),就是采用移動(dòng)迭代器。

值得一提的是,實(shí)現(xiàn)移動(dòng)迭代器的模板類定義在 頭文件,并位于 std 命名空間中。因此,在使用該類型迭代器時(shí),程序中應(yīng)包含如下代碼:

#include using namespace std;

實(shí)現(xiàn) move_iterator 移動(dòng)迭代器的模板類定義如下:

template class move_iterator;

可以看到,在使用此迭代器時(shí),需要傳入一個(gè)基礎(chǔ)迭代器 Iterator。

注意,此基礎(chǔ)迭代器的類型雖然沒有明確要求,但該模板類中某些成員方法的底層實(shí)現(xiàn),需要此基礎(chǔ)迭代器為雙向迭代器或者隨機(jī)訪問(wèn)迭代器。也就是說(shuō),如果指定的 Iterator 類型僅僅是輸入迭代器,則某些成員方法將無(wú)法使用。

C++ STL move_iterator的創(chuàng)建

move_iterator 模板類中,提供了 4 種創(chuàng)建 move_iterator 迭代器的方法。

1) 通過(guò)調(diào)用該模板類的默認(rèn)構(gòu)造函數(shù),可以創(chuàng)建一個(gè)不指向任何對(duì)象的移動(dòng)迭代器。比如:

//將 vector 容器的隨機(jī)訪問(wèn)迭代器作為新建移動(dòng)迭代器底層使用的基礎(chǔ)迭代器typedef std::vector<:string>::iterator Iter;//調(diào)用默認(rèn)構(gòu)造函數(shù),創(chuàng)建移動(dòng)迭代器std::move_iteratormIter;

由此,我們就創(chuàng)建好了一個(gè) mIter 移動(dòng)迭代器,該迭代器底層使用的是 vector 容器的隨機(jī)訪問(wèn)迭代器,但這里沒有為此基礎(chǔ)迭代器明確指向,所以 mIter 迭代器也不知向任何對(duì)象。

2) 當(dāng)然,在創(chuàng)建 move_iterator 迭代器的同時(shí),也可以為其初始化。比如:

//創(chuàng)建一個(gè) vector 容器std::vector<:string> myvec{ "one","two","three" };//將 vector 容器的隨機(jī)訪問(wèn)迭代器作為新建移動(dòng)迭代器底層使用的基礎(chǔ)迭代器typedef std::vector<:string>::iterator Iter;//創(chuàng)建并初始化移動(dòng)迭代器std::move_iteratormIter(myvec.begin());

這里,我們創(chuàng)建了一個(gè) mIter 移動(dòng)迭代器,同時(shí)還為底層使用的隨機(jī)訪問(wèn)迭代器做了初始化,即令其指向 myvec 容器的第一個(gè)元素。

3) move_iterator 模板類還支持用已有的移動(dòng)迭代器初始化新建的同類型迭代器,比如,在上面創(chuàng)建好 mIter 迭代器的基礎(chǔ)上,還可以向如下這樣為新建的移動(dòng)迭代器初始化:

std::move_iteratormIter2(mIter);//還可以使用 = 運(yùn)算符,它們是等價(jià)的//std::move_iteratormIter2 = mIter;

這樣創(chuàng)建的 mIter2 迭代器和 mIter 迭代器完全一樣。也就是說(shuō),mIter2 底層會(huì)復(fù)制 mIter 迭代器底層使用的基礎(chǔ)迭代器。

4) 以上 3 種創(chuàng)建 move_iterator 迭代器的方式,其本質(zhì)都是直接調(diào)用 move_iterator 模板類中的構(gòu)造方法實(shí)現(xiàn)的。除此之外,C++ STL 標(biāo)準(zhǔn)庫(kù)還提供了一個(gè) make_move_iterator() 函數(shù),通過(guò)調(diào)用此函數(shù)可以快速創(chuàng)建一個(gè) move_iterator 迭代器。

C++ STL 標(biāo)準(zhǔn)庫(kù)中,make_move_iterator() 是以函數(shù)模板的形式提供的,其語(yǔ)法格式如下:template move_iterator make_move_iterator (const Iterator& it);

其中,參數(shù) it 為基礎(chǔ)迭代器,用于初始化新建迭代器。同時(shí),該函數(shù)會(huì)返回一個(gè)創(chuàng)建好的移動(dòng)迭代器。

舉個(gè)例子:

typedef std::vector<:string>::iterator Iter;std::vector<:string> myvec{ "one","two","three" };//將 make_move_iterator() 的返回值賦值給同類型的 mIter 迭代器std::move_iteratormIter = make_move_iterator(myvec.begin());#include #include #include #include using namespace std;int main(){ //創(chuàng)建并初始化一個(gè) vector 容器 vector myvec{ "STL","Python","Java" }; //再次創(chuàng)建一個(gè) vector 容器,利用 myvec 為其初始化 vectorothvec(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;}

程序執(zhí)行結(jié)果為:

myvec:othvec:STL Python Java

通過(guò)和程序一做對(duì)比不難看出它們的區(qū)別,由于程序第 11 行為 othvec 容器初始化時(shí),使用的是移動(dòng)迭代器,其會(huì)將 myvec 容器中的元素直接移動(dòng)到 othvec 容器中。

注意,即便通過(guò)移動(dòng)迭代器將容器中某區(qū)域的元素移動(dòng)到了其他容器中,該區(qū)域內(nèi)仍可能殘留有之前存儲(chǔ)的元素,但這些元素是不能再被使用的,否則極有可能使程序產(chǎn)生各種其他錯(cuò)誤。

和其他迭代器適配器一樣,move_iterator 模板類中也提供有 base() 成員方法,通過(guò)該方法,我們可以獲取到當(dāng)前移動(dòng)迭代器底層所使用的基礎(chǔ)迭代器。

舉個(gè)例子:

#include #include #include #include using namespace std;int main(){ typedef std::vector<:string>::iterator Iter; //創(chuàng)建并初始化一個(gè) vector 容器 vector<:string> myvec{ "STL","Java","Python" }; //創(chuàng)建 2 個(gè)移動(dòng)迭代器 std::move_iteratorbegin = make_move_iterator(myvec.begin()); std::move_iteratorend = make_move_iterator(myvec.end()); //以復(fù)制的方式初始化 othvec 容器 vector <: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;}

程序執(zhí)行結(jié)果為:

myvec:STL Java Pythonothvec:STL Java Python

顯然,通過(guò)調(diào)用 base() 成員方法,初始化 othvec 容器的方式轉(zhuǎn)變?yōu)橐詮?fù)制而非移動(dòng)的方式,因此 myvec 容器不會(huì)受到影響。

總結(jié)

以上是生活随笔為你收集整理的auto与迭代器的用法_C++ STL move_iterator移动迭代器用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。