map

1、map insert 用于Map 拷贝的正确方式(end()不需要--)
    map<int, int> a
    map<int, int> b
    b.insert(a.begin(), a.end())
    其中倘若出现键值重复的数值,则仅插入不重复的.

    map insert 插入另一个map时 的效率
    看了一下VC中内部实现,也只是取出两个迭代器中间值每个执行insert,所以也没有什么效率优化处理

2、map中数据插入删除导致map中数据乱掉
    可能是自己定义的key类型中的<操作符重载错误,map中的红黑树要求通过<比较操作可以唯一确定一组key的顺序而不受key传入(即insert)顺序影响。因为Map在查找操作中要求该顺序唯一性。

    一个非正确key举例

    class key
    {
        int a;
        int b;
        operator <(const class & key)
        {
            return (a < key.a ? true : b < key.b); // 错误写法,这种比较并不能唯一确定一组key的顺序,会受insert顺序影响
            /* // 正确写法应该是
            if(a < key.a)
            {
                return true;
            }
            else(a = key.a)
            {
                return b < key.b;
            }
            return false;
            */
        }
    }


    key编号  1    2
    a           1    3
    b           3    1

    在第错误<重载函数中,key1 < key2 而且 key2 < key1.也就是比较顺序会影响结果。结果不稳定。

3、内存释放问题 先释放map迭代器指向的pair,再释放pair中保存的指针指向的内存,出现了内存越界访问。(该结论简单,只是表达一次问题定位中竟出现该中情况的感慨)

    这种问题可能不易出现,实际上在高压情况下则会必现。

原文地址:https://www.cnblogs.com/dongzhiquan/p/2362075.html