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+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;
}
时间: 2024-12-11 10:30:09

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

mysql 插入数据后返回当前的自增ID方法

存储过程的写法: mysql>create procedure test( ->in username varchar(50), ->in password varchar(50), ->out userid int) ->begin ->set @sql=concat("insert into user(`username`,`password`) values(' ",username,"' ,' ",password,&qu

mysql插入数据后返回自增ID的方法

mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法一:是使用last_insert_id mysql> SELECT LAST_INSERT_ID(); 产生的ID 每次连接后保存在服务器中.这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个 AUTO_INCREMEN

Mybatis 插入数据后返回主键值

Oracle中获取刚刚插入记录的主键值: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo">     <selectKey resultType="java.math.BigDecimal" order="BEFORE" keyProperty="id">    SELECT U_US

mybatis框架(6)---mybatis插入数据后获取自增主键

mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标签(可以一个或者多个:比如:女性,爱,钱等等),然后存储到数据库中.怎么存,肯定涉及到三张表,新闻表,标签表,新闻标签id关联表 新闻表插入数据简单,标签表插入数据简单.那新闻标签表呢,如何关联,那是不是需要新闻表和标签表插入数据的时候,返回它们的主键Id然后再存储到新闻标签表中. 这种场景还是蛮常

Laravel 5 插入数据后返回主键ID

方法一: $info = DB::table('表名')->insertGetId(['imgName' => $fileName]);//图片名入库后返回添加数据行的主键ID 方法二:(适用于Mysql数据库) 执行原生SQL,然后返回新添加的主键ID值 语法:INSERT INTO 表名(字段1, 字段2, 字段3) VALUES (值1, 值2, 值3);SELECT @@IDENTITY AS returnName; #返回刚插入的数据的主键ID并起别名为 "returnNa

mysql使用存储过程插入数据后,参数为中文的为?或乱码

最近了解了一下mysql存储过程,之前版本的mysql不支持存储过程,5.0版本后就可以支持存储过程的使用:恰好笔者下载使用版本为5.6.20: 做了一个给表插入数据的简单存储过程,发现打开表后汉字全部显示为?号.如下: 于是上网查资料,忙了两小时才搞定!好了,现在简单叙述一下. 笔者遇见的问题是由两种原因引起的: 第一:使用Navicat数据库客户端建立表设置问题导致的,如下: 将上边操作完成后,可以在表里插入汉字,没有?号或者乱码现象了,本以为问题解决了,但使用存储过程时依然插入的是?号:然

SQL server插入数据后,获取自增长字段的值

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 insert into Tb_People(uname,era,amount) values( '兆周','老年','10000')   select @@identity   --当运行完插入语句后,执行select   @@identity就可得到自动生成的id   --如果是sql server 最好用select SCOPE_IDENTITY() as

mybatis插入数据后返回自增的主键id

在插入数据时候想自动返回mysql的自增的主键,需要在mapper.xml中配置下: <insert id="insert" parameterType="com.rograndec.wdzs.admin.data.wdzs.entity.ProductCategoryEntity" useGeneratedKeys="true" keyProperty="id" > insert into product_cat

SQL Server 插入数据后获得自增主键值

通过SQLServer系统自带函数获取 String sql = "insert into goods values('" + TextBox1.Text + "'," + TextBox2.Text + ",0," + TextBox3.Text + ",'','" + DropDownList1.SelectedItem.Text + "','" + Session["username&quo