迭代器和反向迭代器,常量迭代器和非常量迭代器
生活随笔
收集整理的這篇文章主要介紹了
迭代器和反向迭代器,常量迭代器和非常量迭代器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?迭代器的類型共有4種:<T>::Iiterator,<T>::const_iterator,<T>::reverse_iterator,<T>::const_reverse_iterator
#include <iostream> #include <string> #include <algorithm> #include <iterator> using namespace std; int main() { string line = "you,are,robert"; //返回結(jié)果是常量反向迭代器,所以這里必須定義一個常量反向迭代器 string::const_reverse_iterator it = find(line.crbegin(),line.crend(),','); cout << *it << endl; //line.crbegin()必須在it的前面,這兩個迭代器必須保持字面的先后順序 //(rbegin就在最前面,rend最后) string word(line.crbegin(),it); //string new_word(word.rbegin(),word.rend()); //sort(word.begin(),word.end()); //sort(word.rbegin(),word.rend()); cout << "cout the word:" << endl; cout << word << endl; for(auto i = word.rbegin();i != word.rend();++i)cout << *i;return 0; } #include <iostream> #include <string> #include <algorithm> #include <iterator> using namespace std; int main() { string line = "you,are,robert"; //返回的是常量的反向迭代器,這里也必須定義相同的類型 string::const_reverse_iterator it = find(line.crbegin(),line.crend(),','); cout << *it << endl; //下面的兩個迭代器必須類型完全一致(常量特性,是否反向迭代器,crbegin()必須在最前面) string word(line.crbegin(),it); //這里it.base()已經(jīng)是一個普通的常量迭代器,注意it.base()得到的和it的常量特性是相同的 //所以line.cend()也是一個常量迭代器 string new_word(it.base(),line.cend()); cout << new_word << endl;return 0; }注意:自己總結(jié)出如下規(guī)則(不足之處批評指正)
(1)reverse_iterator有base()成員函數(shù),可以返回它的普通迭代器.
(2)反向迭代器轉(zhuǎn)換為普通迭代器時候,不改變const特性,例如:string::const_reverse_iterator it? ? ? it.base()也是一個常量迭代器,因?yàn)檗D(zhuǎn)換不改變常量特性
(3)在初始化其余容器類型時候,begin()必須在end()之前(如果有中間元素迭代器也一樣),rbegin()必須在rend()之前(如果有中間元素的迭代器也一樣)。即迭代器或者反向迭代器必須遵循理論上字面順序。
(4)用一對迭代器初始化別的容器類型對象的時候,常量特性必須保持一致,是否是反向迭代器也必須一致(盡管通常不用反向迭代器初始化一個string對象,因?yàn)闀衙總€字母倒過來解讀)。
例如 vector<int>? elem(it1,it2);it1和it2如果一個是常量迭代器,另一個也必須是(或者都不是常量迭代器)。
而且it1和it2要么都是反向迭代器,要么都不是反向迭代器。
(5)如果是兩個迭代器比較的時候,只要只想同一個元素,如果僅僅只有const的差別,那么結(jié)果是相等的。
(6)反向迭代器和普通迭代器調(diào)用算法的時候:
把普通迭代器初始化反向迭代器,最后得到一組反向迭代器范圍,那么處理的范圍是一樣的,例如:
#include <iostream> #include <string> #include <sstream> #include <fstream> #include <forward_list> #include <stack> #include <vector> #include <forward_list> #include <deque> #include <array> #include <list> #include <algorithm> #include <iterator> using namespace std; int main() { //這里假設(shè)要反向打印vector中第二個到第七個元素:vector<int> vint{1,2,3,4,5,6,7,8,9,0};ostream_iterator<int> out_iter(cout);//那么根據(jù)迭代器的左閉右開準(zhǔn)則,給的范圍是3-8個, //接下來把迭代器的3-8個元素轉(zhuǎn)變?yōu)榉聪虻鱥t3和it4, //(it4,it3)這個處理范圍對應(yīng)3-8個范圍 //一句話:把一對普通迭代器轉(zhuǎn)換成反向迭代器,處理的范圍和原來迭代器范圍一樣 //運(yùn)行結(jié)果是:76543 vector<int>::reverse_iterator it3(vint.begin() + 2),it4(vint.begin() + 7); copy(it4,it3,out_iter);//反過來,把一對反向迭代器轉(zhuǎn)化成普通迭代器后,處理范圍會改變嗎? vector<int>::iterator i1 = it3.base(),i2 = it4.base(); copy(i1,i2,out_iter); //運(yùn)行結(jié)果是 34567return 0; }(7)c++ primer(5th)365頁上說,從普通迭代器給反向迭代器賦值或者初始化,那么得到的不是指向同一個元素的迭代器,但是我在gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 上,不能用普通迭代器給反向迭代器賦值(這里指等號賦值)。
這里必須采用圓括號初始化才可以。賦值本人還不會,有大神會就給我回復(fù)一個,謝謝!!!
而反向迭代器給普通迭代器賦值,必須通過反向迭代器的成員函數(shù)base()才能實(shí)現(xiàn)
?
?
?
總結(jié)
以上是生活随笔為你收集整理的迭代器和反向迭代器,常量迭代器和非常量迭代器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++迭代器的一个例子
- 下一篇: c语言程序设计现代方法(2th)第12章