首页 > 代码库 > 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()以及当前迭代器的变化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。