std::map 在循环中删除元素

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操作的失败并引起进程的异常。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C++11之前,对于`std::map`进行循环删除操作是不安全的,因为在删除元素时会改变`std::map`的迭代器,可能导致循环出现问题。但是从C++11开始,可以使用`std::map`提供的成员函数`erase()`和迭代器后置自增运算符来实现安全的循环删除操作。 下面是一个例子,演示如何使用`for`循环和`erase()`函数安全地删除`std::map`的元素: ```c++ #include <map> int main() { std::map<int, int> my_map = {{1, 10}, {2, 20}, {3, 30}, {4, 40}, {5, 50}}; for (auto it = my_map.begin(); it != my_map.end();) { if (it->second == 30) { it = my_map.erase(it); } else { ++it; } } return 0; } ``` 在这个例子,我们检查`std::map`每个元素的值,如果值等于30,我们就使用`erase()`函数删除这个元素,否则使用迭代器后置自增运算符移动到下一个元素。这种方法可以确保在删除元素时不会改变迭代器,从而避免循环出现问题。 ### 回答2: for循环可以用来遍历std::map,并且可以在遍历过程删除元素。 在使用for循环遍历std::map时,我们需要注意的是,在每次循环不能直接删除当前元素,因为这会改变std::map的迭代器。对于这种情况,我们可以使用一个临时的迭代器来保存下一个元素的位置,然后再删除当前元素。 具体的操作步骤如下: 1. 定义一个临时的迭代器tempIter,用来保存下一个元素的位置。 2. 使用for循环std::map进行遍历,迭代器变量为iter。 3. 在循环,首先将tempIter赋值为iter的下一个位置:tempIter = std::next(iter)。 4. 然后判断需要删除的元素条件,并执行删除操作。比如,可以使用iter->first来判断键的值是否满足删除条件。 5. 最后将iter更新为tempIter,即iter = tempIter,以便进行下一次迭代。 注意,这种方式可以在C++11及以后的版本使用,因为std::next()函数是C++11新增的函数。 简单的示例代码如下: ```cpp std::map<int, std::string> myMap; myMap.insert(std::make_pair(1, "one")); myMap.insert(std::make_pair(2, "two")); myMap.insert(std::make_pair(3, "three")); myMap.insert(std::make_pair(4, "four")); for (auto iter = myMap.begin(); iter != myMap.end(); ) { auto tempIter = std::next(iter); if (iter->first % 2 == 0) { // 删除偶数键的元素 myMap.erase(iter); } iter = tempIter; } // 输出剩余的键值对 for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } ``` 以上代码会删除std::map的偶数键的元素,并输出剩余的键值对。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值