首页 > 代码库 > c++ map 插入数据后,begin(),end()以及当前迭代器的变化

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 6string 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;}

 

c++ map 插入数据后,begin(),end()以及当前迭代器的变化