天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 25|回复: 0

要删除 `my_Map` 中所有与 `my_Map_sub` 中相同的键(即 `double` 类型的键)

[复制链接]
  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 79 天

    [LV.6]常住居民II

    1543

    主题

    198

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
    发表于 2024-4-25 10:28:58 | 显示全部楼层 |阅读模式
    要删除 `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++ 编译器版本以及对代码简洁性和效率的需求。

     

     

     

     

    要删除 `my_Map` 中所有与 `my_Map_sub` 中相同的键(即 `double` 类型的键)
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-12 22:17 , Processed in 0.058394 second(s), 21 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表