這幾天因為在研究動態規劃:單調減子串行這個問題時,用到了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 一些可以讓人可以開心的方法 人在這個世界上生存,如果每一天只知道不停地忙碌,然後,就是不知所謂地活著,那是一種悲哀。但仍有很多人還是在這樣不知所謂地忙碌著,為生存而生存。最近,看得最多的是一些企業的老...