stl 的remove 记我很费解
这个remove让我很费解啊。
根据介绍它只是把后面的元素覆盖到要删除的元素的位置。
我也在网上查了一下这个函数,内部实现的原理挺别扭的。
stl设计这个函数是为什么呢。是为了性能吗。
[解决办法]
你看看STL容器的内存分配机制
1,对于小对象的分配和大对象的分配是不一样的
超过128字节的直接调用::new在全局内存分配
否则在自己保留堆了分配
2,小对象的分配
a,在需要分配小对象内存的时候,直接::new一大块内存保留起来
b,在这快保留内存里面分配小对象的内存,如果后面还要继续分配小对象,就接在前面的小对象后面继续分配
c,这快保留内存分配完以后的状态是,对象挨得很紧揍,中间没有间隔的空于内存(也叫内存碎片)
d,remove的时候,如果你只是简单地将要romove的对象摸除,那么这里就形成了一个碎片,如果是把后面的往前移过来,那么中间就不存在碎片,而是在最后面腾出了空余内存,以后分配小对象的时候可以继续接在后面.
[解决办法]
1 2 3 3 4 5
remove(beg,end,1)就是
2 3 3 4 5 5
remove(beg,end,3)就是
1 2 4 5 4 5
remove(beg,end,5)还是
1 2 3 3 4 5
[解决办法]
除了性能,主要是STL的算法和容器的分离。算法只知道迭代器类型,不知道如何真正删除(erase)内容。只有容器才知道怎么删。那么,remove算法只能进行数据移动,然后让容器去做真正的删除工作
[解决办法]
为了性能
也为了算法的原子性和正交性