c++ map 插入數據后,begin(),end()以及當前迭代器的變化


1. map.end()指向map的最后一個元素之后的地址,無論執行map.erase(iter)還是map.add(key, value),map.end()所返回的值永遠不會發生變化,都是指向同一塊內存。

2. map.begin()指向map的第一個元素,map.begin()可能隨着map.erase(iter)或是map.add(key, value)操作而發生改變。例如當第一個元素被刪除后,map.begin()就發生了改變,指向原來第一個元素之后的那個元素了。或是如果新插入一個鍵值對,該鍵值對的key放到btree(我們假設map內部是由btree實現的,實際上也可能有別的實現方式)中會排在map.begin()->first的前面,那么map.begin()也會指向新插入的這個鍵值對了。

3. map.erase(iter)執行后,當前iter就失去意義了,再執行++iter就會出問題。

 

實驗代碼如下:

#include <map>
#include <string>
#include <stdio.h>
#include <iostream>

using namespace std;
#define NUM 6
string string_trim(const string &data,const char *space){
    size_t begin_pos = data.find_first_not_of(space);
    size_t end_pos = data.find_last_not_of(space);
    if(begin_pos != string::npos)
    {
        return data.substr(begin_pos,end_pos-begin_pos+1);
    }
    return string("");
}
int main()
{
    map<int, int> myMap;
    for(int i=1; i<NUM; ++i)
    {
        myMap.insert(pair<int, int>(i*1000,i*100));
    }
/*
    for(int i=0; i<NUM; ++i)
        {
                myMap.insert(pair<int, int>(i,i*10000));
        }
*/
    int n = 8;    
    map<int, int>::iterator iter = myMap.begin();
    map<int, int>::iterator iterEnd = myMap.end();//先保存iterEnd,用於比較myMap.end()是否會發生變化
    map<int, int>::iterator iterBegin = iter;
    //printf("minux=%d\n",iterEnd-iter);
    myMap.insert(pair<int, int>(100000,1));
    if(iterEnd== myMap.end())
    {
        printf("aaa not changed end()\n");
    }
    for(; iter!=myMap.end(); ++iter)
    {
        bool beginEqual = iter==iterBegin;
        bool endEqual = (iter== iterEnd);
        printf("key:%d, value:%d\n", iter->first, iter->second);
//        printf("bgeinEqual = %d, endEqual = %d\n", beginEqual, endEqual);
        if( n<20) myMap.insert(pair<int, int>(n,n*10));
        ++n;
        //myMap.erase(iter);
    //    iterEnd = myMap.end();
        
//        printf("key:%d, value:%d\n", iter->first, iter->second);
    }
    if(iter==iterEnd)
    {
        printf("end not change\n");
    }
    else
    {
        printf("end is changed\n");
    }
    if(iterBegin == myMap.begin())
    {
        printf("begin not change\n");
    }
    else
    {
        printf("begin is changed\n");
    }
    printf("---遍歷打印myMap里的內容-----------\n");
    iter = myMap.begin();
    for(; iter!=myMap.end(); ++iter)
    {
        printf("key:%d, value:%d\n", iter->first, iter->second);
                
    }
    printf("finished\n");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM