c++ map删除指定元素

错误一:

int main(int argc, char* argv[])
{
map<string, string> mapData;

mapData["a"] = "aaa";   
mapData["b"] = "bbb";   
mapData["c"] = "ccc";   


for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); i++)  
{  
    if (i->first == "b")  
    {  
        mapData.erase(i);  
    }  
}  
return 0;  

}

错误:
i指针在元素被删除后失效了,回到for语句中与mapData.end() 进行比较错误,这个一般都了解。

错误二:

int main(int argc, char* argv[])
{
map<string, string> mapData;

mapData["a"] = "aaa";   
mapData["b"] = "bbb";   
mapData["c"] = "ccc";   


for (map<string, string>::iterator i=mapData.begin(); i!=mapData.end(); /*i++*/)  
{  
    if (i->first == "b")  
    {  
        mapData.erase(i/*++*/);  
    }  
    else  
    {  
        /*i++*/;  
    }  
     i++;  
}  
return 0;  

}

解析:
mapData.erase(i++);
这段代码的真正等效代码是:

map<string, string>::iterator iterTemp = i;
++ i;
mapData.earse(iterTemp);

在执行earse之前,i已经被加上1了,earse会是的以前的那个未被加一的i失效,而加了1之后的新的i是有效的。

### C++ STL `std::map` 删除指定对 在C++标准模板库(STL)中,`std::map` 提供了几种方法用于删除特定的键对。这些方法能够满足不同的需求并提供灵活性。 #### 使用 erase 函数按键删除单个元素 可以通过调用 `erase` 成员函数并通过传递要移除项的关键字参数来实现这一点。此操作会找到对应的键并将该键及其关联的数据从映射表中去除: ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap; // 插入一些数据到myMap... myMap.insert({1, "one"}); myMap.insert({2, "two"}); myMap.insert({3, "three"}); size_t deletedCount = myMap.erase(2); // 尝试删除键为2的元素 if (deletedCount > 0) { std::cout << "Element with key '2' has been successfully removed." << std::endl; } else { std::cout << "No element found with the specified key." << std::endl; } return 0; } ``` 上述代码展示了如何利用 `erase(key)` 方法尝试移除具有给定键名的项目[^1]。 #### 使用迭代器范围删除多个连续元素 如果想要一次性清除某个范围内所有的条目,则可以采用基于两个迭代器作为边界的版本来进行批量清理工作: ```cpp auto itStart = myMap.lower_bound(startKey); auto itEnd = myMap.upper_bound(endKey); if(itStart != myMap.end()){ myMap.erase(itStart, itEnd); } ``` 这段程序片段说明了怎样通过指定起始和结束位置之间的边界来执行多记录的同时消除动作[^4]。 #### 清空整个 map 中的内容 当目标是要彻底清空当前容器内的全部成员时,最简单的方式就是直接调用 clear(): ```cpp myMap.clear(); ``` 这将迅速释放所有已分配资源,并使内部大小重置回零状态[^3]。 #### 注意事项 - 调用 `erase()` 后返回的是被成功擦除掉的对象数目,在大多数情况下应该是要么是0要么是1;但如果是在 multimap 上使用的话可能会大于一。 - 如果试图删除不存在于容器中的键,则不会有任何效果也不会抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值