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中保存的指针指向的内存,出现了内存越界访问。(该结论简单,只是表达一次问题定位中竟出现该中情况的感慨)
这种问题可能不易出现,实际上在高压情况下则会必现。