讓人感到頭大的一些multimap的迭代器用法

2021-07-22 13:17:24 字數 3119 閱讀 5332

這幾天因為在研究動態規劃:單調減子串行這個問題時,用到了c++的stl容器multimap,結果被它的迭代器搞的雞飛狗跳。它的迭代器用法有些邏輯是我想明白了的,但有些邏輯又使我感到困擾,尤其是正向迭代器和反向迭代器的插入演算法的邏輯居然不一樣,非常不解啊!在這裡把這些問題列出來,算是一些經驗吧。

首先,就是multimap.end()和multimap.rend()這兩個迭代器到底是指向何處。經測試,multimap.end()指向multimap最後乙個元素之後乙個位置,如果直接使用multimap.end()來作為乙個pair<>元素的話,程式是要溢位的;multimap.rend()是反向迭代器的最後乙個元素之後乙個位置,如果直接使用程式也是要溢位。如果要用正向迭代器定位最後乙個元素,必須是用multimap.end()--;而要想用反向迭代器定位第乙個元素,必須是用multimap.rend()--。

附帶說一下,我們知道multimap是按key的大小有小至大排序的,而multimap允許重複key元素存在,那麼相同key怎麼排序呢?答案就是當插入相同key的pair時,multimap是按照插入順序的先後進行排序的。

測試**:

int main()

{ multimapmap_multi;

multimap::iterator iter,last_iter;

multimap::reverse_iterator reverse_iter;

map_multi.insert(pair(1,87));

map_multi.insert(pair(5,98));

map_multi.insert(pair(1,62));

map_multi.insert(pair(5,78));

map_multi.insert(pair(5,82));

cout<<"elements of multimap in order:";

for(iter=map_multi.begin(); iter!=map_multi.end(); iter++)

cout<<"<" ";

cout " " " "<

測試**:

cout<<"elements of multimap in reverse order:";

for(reverse_iter=map_multi.rbegin(); reverse_iter!=map_multi.rend(); reverse_iter++)

cout<<"<" ";

cout ";

cout<:"<<"<" ";

map_multi.insert(pair(5,57));

cout<<",after insert <5,57>,reverse_ite->:"<<"<" " ";

cout<:"<<"<" ";

map_multi.insert(pair(6,11));

cout<<",after insert <6,11>,reverse_iter->:"<<"<" " ";

cout<:"<<"<" ";

map_multi.insert(pair(4,39));

cout<<",after insert <4,39>,reverse_iter->:"<<"<" " ";

cout<

測試**:

reverse_iter=map_multi.rbegin(); //好了,這裡出現了疑惑;

reverse_iter++;

cout<<"reverse_iter->:"<<"<" ";

map_multi.insert(pair(5,43));

cout<<",after insert <5,43>,reverse_iter->:"<<"<" " ";

cout<:"<<"<" ";

map_multi.insert(pair(5,24));

cout<<",after insert <5,24>,reverse_iter->:"<<"<" "<::reverse_iterator的使用邏輯,我們再看正向迭代器的使用。如果乙個正向迭代器iter=map_multi.begin();,那麼multimap 會不會和reverse_iterator一樣,在insert插入元素後對進行一些自動更新iter的操作呢?答案就是,沒有!你沒看錯,就是沒有!無論你插入pair的key是在begin的元素之前還是之後,都不會自動更新iter內容,iter還是指向插入之前的元素!還有iter(下面測試**裡last_iter也證明了這點)無論指向那乙個元素,無論插入元素是在那個位置,無論插入pair的key有沒有重複,iter都不會變化,都不會變化!呵~呵~呵~呵~呵~

測試**:

map_multi.clear();

map_multi.insert(pair(3,87));

map_multi.insert(pair(4,98));

map_multi.insert(pair(5,62));

map_multi.insert(pair(3,78));

map_multi.insert(pair(3,82));

iter=map_multi.begin();

cout<<"iter->:"<<"<" ";

map_multi.insert(pair(3,12));

cout<<",after insert <3,12>,iter->:"<<"<" " ";

cout<:"<<"<" ";

map_multi.insert(pair(2,36));

cout<<",after insert <2,36>,iter->:"<<"<" " ";

cout<:"<<"<" ";

map_multi.insert(pair(3,46));

cout<<",after insert <3,46>,iter->:"<<"<" " ";

cout<:"<<"<" ";

map_multi.insert(pair(4,48));

cout<<",after insert <4,48>,last_iter->:"<<"<" " ";

cout<:"<<"<" ";

map_multi.insert(pair(5,73));

cout<<",after insert <5,73>,last_iter->:"<<"<" " ";

cout<

總有一些事讓人興奮

always tell myself never give up.最近因為疫情的原因,很多事情都彷彿停滯了,去年年底還在計畫今年的很多目標。現在看來,真是應驗了那句老話 計畫趕不上變化。我發現自己有乙個現象,就是不工作1 2天之後就會開始懷疑自己的能力。不知其他人會不會這樣?但是回想過去,其實只要自...

做文件類的工作總是讓我感到一些煩躁

不停的在寫文件,自己想寫的 趕了一些,被老闆打斷,去做另乙個文件類的工作,而寫的內容是我不熟悉的 其實我並不反感寫文件,以前的數模都是乙個人通宵的寫,畢業 也是看著歐冠完成的,因為寫的是自己做過的事,寫的順口 順手 然而,很多時候卻需要寫一些自己都不知道的事,自己都不清楚,但要讓別人清楚,說白了,就...

一些可以讓人可以開心的方法

24 0xff return this.fontmap.substring 2 id 1 2 id 一些可以讓人可以開心的方法 人在這個世界上生存,如果每一天只知道不停地忙碌,然後,就是不知所謂地活著,那是一種悲哀。但仍有很多人還是在這樣不知所謂地忙碌著,為生存而生存。最近,看得最多的是一些企業的老...