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+);
- }
- return string("");
- }
- int main()
- {
- map<int, int> myMap;
- for(int i=; i<NUM; ++i)
- {
- myMap.insert(pair<int, int>(i*,i*));
- }
- /*
- for(int i=0; i<NUM; ++i)
- {
- myMap.insert(pair<int, int>(i,i*10000));
- }
- */
- int n = ;
- 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>(,));
- 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<) myMap.insert(pair<int, int>(n,n*));
- ++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 ;
- }
c++ map 插入数据后,begin(),end()以及当前迭代器的变化的更多相关文章
- mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- mysql插入数据后返回自增ID的方法
mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法一是使用la ...
- mysql 插入数据后返回当前的自增ID方法
存储过程的写法: mysql>create procedure test( ->in username varchar(50), ->in password varchar(50), ...
- 【JAVA - SSM】之MyBatis插入数据后获取自增主键
很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作.针对这个问题,有两种解决方案: (1)先插入,后查询.我们可以先插入一条数据,然后根据插入的数据的各个字段 ...
- mybatis框架(6)---mybatis插入数据后获取自增主键
mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- 普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚
普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚
- Mybatis插入数据后返回主键id
有时候使用mybatis插入数据后,需要用到记录在数据库中的自增id,可以利用keyProperty来返回,赋值给实体类中的指定字段. 单条记录插入并返回 First, if your databas ...
随机推荐
- VB编程技巧推荐
VB编程技巧推荐 1.zyl910的专栏——理论水平高 用VB写高效的图像处理程序 V2.0 优化分支代码——避免跳转指令堵塞流水线 2.Laviewpbt的专栏 —— 有很多算法的代码,实用性高 ...
- css样式float造成的浮动“塌陷”问题的解决办法
什么是CSS Float? 定义: float 属性定义元素浮动到左侧或右侧.以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动.浮动元素会生成一个块级元素,而不论 ...
- php 在web端读出pdf 与各种文件下载
单纯的下载功能实现 <?php // 表示调用文本类型为pdf的应用 header('Content-type: application/pdf'); // 这句可以输出下载页面进行下载 hea ...
- Google与微软为jQuery等类库提供的CDN服务
相关链接: Google: http://code.google.com/apis/ajaxlibs/Microsoft: http://www.asp.net/ajaxlibrary/cdn.a ...
- 【转载】逃离adapter的地狱-针对多个View type的组合实现方案
英文原文:JOE'S GREAT ADAPTER HELL ESCAPE 转载地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015 ...
- Linux下面/usr/local和opt目录
1./opt This directory is reserved for all the software and add-on packages that are not part of the ...
- nodejs新手教程中upload file的问题
可参见: http://cnodejs.org/topic/50234890f767cc9a51f88481 request.setEncoding("utf8");应注释掉.
- JavaScript设计模式之代理模式
一.代理模式概念 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象控制具体对象的引用.代理几乎可 ...
- 终端编写c程序
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:JackAlan链接:http://www.zhihu.com/question/21483375/answer/322672 ...
- 转:java开发的10位牛人
文章来自于:http://it.deepinmind.com/java/2014/04/10/top-10-java-people-you-should-know.html James Gosling ...