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 ...
随机推荐
- C#自定义事件:属性改变引发事件示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- 完美解决Android完全退出程序(转)
背景:假说有两个Activity, Activity1和Activity2, 1跳转到2,如果要在2退出程序,一般网上比较常见的说法是用 System.exit(0) 或是 android.os.Pr ...
- div如何加滚动条
<div style="position:absolute; height:400px; overflow:auto"></div>div 设置滚动条显示: ...
- 阿里UX矢量图标库–最强大的矢量图标库(Icon font制作力荐工具)
继前面介绍过ICON-FONT的制作后,找了几个ICON库都是国外的今天偶然发现阿里巴巴的图标矢量库,www.iconfont.cn用了之后感觉很强大,丰富的图标库(集合阿里妈妈&淘宝的图标库 ...
- asp.net用Zxing库实现条形码输出的具体实现
首先要在项目中添加zxing.dll引用(zxing.dll下载地址http://www.jb51.net/dll/zxing.dll.html) 其次就是建立aspx文件,在后台中代码如下 复制代码 ...
- [转帖]gesture recognition
http://wenku.baidu.com/view/53c3331a6bd97f192279e9c9.html HSI与RGB的Matlab实现. http://wenku.baidu.com/v ...
- oracle死锁模拟
环境介绍: 用户test01 创建表tab01,用户test02创建表tab02.Test01 更新tab01不提交,test02 更新表tab02不提交.然后test01 更新test02下的表ta ...
- NSString&NSMutableString常用操作梳理(转)
作者:弦苦 授权本站转载. 上一篇梳理了NSArray&NSMutableArray常用操作,这次来梳理一下Objective-C中每天都要用到的字符串处理类——NSString. Objec ...
- C++ Primer 5th 第13章 拷贝控制
当一个对象的引用或者指针离开作用域时,析构函数不会执行. 构造函数有初始化部分(初始化列表)和函数体. 析构函数有析构部分和函数,但析构函数的析构部分是隐式的.
- [javascript]String添加trim和reverse方法
function trim() { var start, end; start = 0; end = this.length - 1; while(start <= end && ...