关于map::erase

本文讨论了不同版本的STL库中map::erase函数的行为差异,特别是在P.J.Plauger STL与sgi STL之间的区别。展示了如何编写兼容代码以确保函数在不同环境下的一致性。

 用map::erase的时候要注意,这个函数是有版本差异的,vc下使用的stl是P.J. Plauger stl版本,dev下使用的是sgi stl。这两个版本的map::erase有所区别,前者有返回值,后者没有返回值,标准库中提供的接口是没有返回值的,所以对于P.J. Plauger stl版本的使用者,在使用这个函数时,为了能保证移植性,最好能写成以下形式:

 

`std::map` 是 C++ 标准模板库(STL)中的关联容器,用于存储键值对,并允许通过键来快速检索值。`std::map` 的 `erase` 方法用于从 `map` 中移除元素,它有以下几种使用方式: ### 1. `erase(iterator position)` 此方法用于移除 `position` 所指向的元素。 ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}}; auto it = myMap.find(2); if (it != myMap.end()) { myMap.erase(it); } for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` ### 2. `erase(const key_type& k)` 该方法移除键为 `k` 的元素(如果存在),并返回被移除元素的数量(对于 `std::map`,返回值只能是 0 或 1)。 ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}}; size_t removed = myMap.erase(2); if (removed > 0) { std::cout << "Element with key 2 removed." << std::endl; } for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` ### 3. `erase(iterator first, iterator last)` 此方法移除范围 `[first, last)` 内的所有元素。 ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}, {4, "four"}}; auto first = myMap.find(2); auto last = myMap.find(4); if (first != myMap.end() && last != myMap.end()) { myMap.erase(first, last); } for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` ### 迭代器失效问题 使用 `erase` 方法后,被移除元素的迭代器会失效。如果要在遍历 `std::map` 时删除元素,需要特别注意迭代器的更新。例如: ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}}; for (auto it = myMap.begin(); it != myMap.end(); ) { if (it->first == 2) { it = myMap.erase(it); } else { ++it; } } for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值