|
要删除 `my_Map` 中所有与 `my_Map_sub` 中相同的键(即 `double` 类型的键),可以使用以下代码:
```cpp
#include <algorithm>
#include <map>
// 假设已初始化 my_Map 和 my_Map_sub
for (const auto& entry : my_Map_sub) {
my_Map.erase(entry.first);
}
// 或者使用 C++17 标准及以后版本的范围 for 循环配合 erase-if 函数
// 注意:erase-if 在 C++20 才正式成为标准的一部分,但一些编译器在 C++17 已实现该功能
// std::ranges 是 C++20 引入的库,如果使用 C++17,可能需要包含头文件 <experimental/ranges>
// 并将 std::ranges 替换为 std::experimental::ranges
if constexpr (std::ranges::range<decltype(my_Map_sub)> && std::ranges::range<decltype(my_Map_sub)::value_type>) {
my_Map.erase(std::remove_if(my_Map.begin(), my_Map.end(),
[&](const auto& map_entry) {
return std::ranges::find(my_Map_sub, map_entry.first) != my_Map_sub.end();
}),
my_Map.end());
}
```
第一种方法遍历 `my_Map_sub` 中的所有键,然后直接在 `my_Map` 中逐个删除这些键。这种方法简单直观,适用于所有 C++ 版本。
第二种方法使用了 C++17 及以上版本的范围 for 循环结合 `erase-if` 函数(C++20 才正式成为标准的一部分,但一些编译器在 C++17 已实现)。此方法通过 `remove_if` 算法移除满足条件(即键存在于 `my_Map_sub` 中)的元素,然后调用 `erase` 删除这些已被标记为“应移除”的元素。这种方法更为简洁高效,特别是当 `my_Map` 大小较大时。
选择哪种方法取决于你的 C++ 编译器版本以及对代码简洁性和效率的需求。 |
|