stl map高效遍历删除的方法 [转]

摘要:
=mapStudent.end();){if{//如果满足删除条件,请删除当前节点并指向下一个节点mapStudent.eerase;}否则{//若不满足条件,请指向下一节点iter++;}}STL源代码中也建议使用此删除方法。分析mapStudent.erase语句。在映射中删除iter时,首先缓存iter,然后执行iter++以指向下一个节点,然后进入擦除函数体执行删除操作。删除过程中使用的iter是缓存的iter。根据以上分析,我们可以看到mapStudent.erase和mapStudent.exe;iter++执行顺序不同。
for(;iter!=mapStudent.end();)
{
     if((iter->second)>=aa)
     {
         //满足删除条件,删除当前结点,并指向下面一个结点
              mapStudent.erase(iter++);
     }
     else
     {
     //条件不满足,指向下面一个结点
     iter++;
     }
}
这种删除方式也是STL源码一书中推荐的方式,分析 mapStudent.erase(iter++)语句,map中在删除iter的时候,先将iter做缓存,然后执行iter++使之指向下一个结点,再进入erase函数体中执行删除操作,删除时使用的iter就是缓存下来的iter(也就是当前iter(做了加操作之后的iter)所指向结点的上一个结点)。
    根据以上分析,可以看出mapStudent.erase(iter++)和map Student.erase(iter); iter++;这个执行序列是不相同的。前者在erase执行前进行了加操作,在iter被删除(失效)前进行了加操作,是安全的;后者是在erase执行后才进行加操作,而此时iter已经被删除(当前的迭代器已经失效了),对一个已经失效的迭代器进行加操作,行为是不可预期的,这种写法势必会导致 map操作的失败并引起进程的异常。
 
转自: http://www.cnblogs.com/lidabo/p/3552552.html

免责声明:文章转载自《stl map高效遍历删除的方法 [转]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python 多重继承构造函数调用顺序支持复制粘贴word公式的CKEditor编辑器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

博雅大数据机器学习十讲第三讲

点到平面的距离 直线方程:(w_1x_1+w_2x_2+w_0 = 0) 点到直线距离(d = frac {|w_1x_1^{'}+w_2x_2^{'}+w_0|}{sqrt{w^2_1+w^2_2}}) 欧式空间超平面:(w_1x_1+w_2x_2+...+w_dx_d+w_0 = 0) 点到超平面距离: [d = frac {|w_1x_1^{'...

C++ Primer第5版 第四章课后练习答案

练习4.1 105 练习4.2 (a) *(vec.begin())  (b) (*vec.begin()+1) 练习4.3 可以,不过这需要程序员对于编译器优化过程有更深入的了解。 练习4.4 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;/*结果是91*/12 / 3 * (4 + 5) * 15 + 24 % 4 / 2;/*结果...

diedaiqi

转自:https://www.cnblogs.com/maluning/p/8570717.html https://www.cnblogs.com/ShaneZhang/p/4249173.html 正文 迭代器是一种检查容器内元素并遍历元素的数据类型。C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类...

动手学深度学习14- pytorch Dropout 实现与原理

方法 从零开始实现 定义模型参数 网络 评估函数 优化方法 定义损失函数 数据提取与训练评估 pytorch简洁实现小结 针对深度学习中的过拟合问题,通常使用丢弃法(dropout),丢弃法有很多的变体,本文提高的丢弃法特指倒置丢弃法(inverted dorpout)。 方法 在会议多层感知机的图3.3描述了一个单隐藏层的多层感知机。其中输...

句柄类与继承

前一小节《容器与继承》http://blog.csdn.net/thefutureisour/article/details/7744790提到过: 对于容器,假设定义为基类类型,那么则不能通过容器訪问派生类新增的成员;假设定义为派生类类型,一般不能用它承载基类的对象,即使利用类型转化强行承载,则基类对象能够訪问没有意义的派生类成员,这样做是非常危...

C/C++迭代器使用具体解释

迭代器是一种检查容器内元素并遍历元素的数据类型。能够替代下标訪问vector对象的元素。 每种容器类型都定义了自己的迭代器类型,如 vector: vector<int>::iterator iter;这符语句定义了一个名为 iter 的变量。它的数据类型是 vector<int> 定义的 iterator 类型。每一个标准库容器...