这几天因为在研究动态规划:单调减子序列这个问题时,用到了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()
{
multimap<int,int> map_multi;
multimap<int,int>::iterator iter,last_iter;
multimap<int,int>::reverse_iterator reverse_iter;
map_multi.insert(pair<int,int>(1,87));
map_multi.insert(pair<int,int>(5,98));
map_multi.insert(pair<int,int>(1,62));
map_multi.insert(pair<int,int>(5,78));
map_multi.insert(pair<int,int>(5,82));
cout<<"Elements of multimap in order:";
for(iter=map_multi.begin(); iter!=map_multi.end(); iter++)
cout<<"<"<<iter->first<<","<<iter->second<<"> ";
cout<<endl;
iter=map_multi.begin();
cout<<"multimap.begin():"<<"<"<<iter->first<<","<<iter->second<<"> "<<endl;
iter=map_multi.end(); //指向的是multimap中最后一个元素后面的一位;
iter--;
cout<<"multimap.end()--:"<<"<"<<iter->first<<","<<iter->second<<"> "<<endl;
reverse_iter=map_multi.rbegin();
cout<<"multimap.rbegin():"<<"<"<<reverse_iter->first<<","<<reverse_iter->second<<"> "<<endl;
reverse_iter=map_multi.rend(); // 指向的是multimap中最后一个元素后面的一位;
reverse_iter--;
cout<<"multimap.rend()--:"<<"<"<<reverse_iter->first<<","<<reverse_iter->second<<"> "