zoukankan      html  css  js  c++  java
  • 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
    ",iterEnd-iter);
        myMap.insert(pair<int, int>(100000,1));
        if(iterEnd== myMap.end())
        {
            printf("aaa not changed end()
    ");
        }
        for(; iter!=myMap.end(); ++iter)
        {
            bool beginEqual = iter==iterBegin;
            bool endEqual = (iter== iterEnd);
            printf("key:%d, value:%d
    ", iter->first, iter->second);
    //        printf("bgeinEqual = %d, endEqual = %d
    ", 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
    ", iter->first, iter->second);
        }
        if(iter==iterEnd)
        {
            printf("end not change
    ");
        }
        else
        {
            printf("end is changed
    ");
        }
        if(iterBegin == myMap.begin())
        {
            printf("begin not change
    ");
        }
        else
        {
            printf("begin is changed
    ");
        }
        printf("---遍历打印myMap里的内容-----------
    ");
        iter = myMap.begin();
        for(; iter!=myMap.end(); ++iter)
        {
            printf("key:%d, value:%d
    ", iter->first, iter->second);
                    
        }
        printf("finished
    ");
        return 0;
    }
  • 相关阅读:
    PHP操作MYSQL数据库
    微信DLL劫持反弹shell复现
    ERROR Invalid options in vue.config.js: "baseUrl" is not allowed
    求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小。
    CentOS、Ubuntu、Debian三个linux比较异同
    jpa模糊查询(表中的某些数据)
    jpa查找数据库最新一条消息
    在@Data注释lombok上使用继承警告等于/ hashCode(Warning equals/hashCode on @Data annotation lombok with inheritance)
    git基本操作
    远程分支git换地址了,本地重新关联
  • 原文地址:https://www.cnblogs.com/james6176/p/4021741.html
Copyright © 2011-2022 走看看