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 ...
随机推荐
- JPA事务回滚配置
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.or ...
- jquery获取value值
$(function(){ alert(1); var a=$("#a004").val(); var a1=$("#b004").val(); //.val就 ...
- LinkButton和HyperLink的页面跳转用法
<%--<asp:HyperLink ID="HyperLink1" NavigateUrl='<%#"/Fxy_Admin/Pro_ClassNew. ...
- c - 向一个排序好的数组插入一个数,插入后数组依然是排序好的
概述 因为这里只是演示插入1个数,这里我不用malloc再重新分配,而是将原先数组的腾出一个占位符. 完整代码如下: #include <stdio.h> #define LEN 6 // ...
- 你好,C++(36)人参再好,也不能当饭吃!6.3 类是如何面向对象的
6.3 类是如何面向对象的 类作为C++与面向对象思想结合的产物,作为面向对象思想在C++中的载体,它的身上流淌着面向对象的血液.从类成员的构成到类之间的继承关系再到虚函数,到处都体现着面向对象封装 ...
- 【USACO 3.1.3】丑数
[描述] 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它).这是 ...
- 3.5 linux 0.11 目标文件格式
在Linux0.11系统中,GNU gcc或gas编译输出的目标模块文件和链接程序生成的可执行文件都使用了UNIX传统的a.out格式.这是一种被称为汇编与链接输出(Assembly & li ...
- windows计划任务执行SQLserver脚本
2016年3月1号,北京出差,documentbrowser系统改善上线. 其中有一个数据库表需要每天进行同步,原计划使用SQLServer的作业来执行又方便又快捷,但是客户的数据库是05的expre ...
- typedef , static和 extern
typedef 1.作用:给已经存在的类型起一个新的名称 2.使用场合: 1> 基本数据类型 2> 指针 3> 结构体 4> 枚举 5> 指向函数的指针 #include ...
- C语言到底怎么分配空间
程序分为:代码区.数据区.bss区.堆区.栈区.平时常用区分的是代码区.堆区.栈区.下面加上例子区分一下. 3 代码区顾名思义就是存放代码的,里面的内容是不可以修改的.例如你定义了一个变量char * ...