ZBLOG

for (auto it = locationMap.begin(); it != locationMap.end(); ++it) { }遍历删除

如果您需要在遍历 std::map 的同时删除某些元素,可以使用 erase 方法。由于在循环中直接删除元素可能会导致迭代器失效,因此需要小心处理。以下是一个示例代码,演示了如何安全地遍历并删除 std::map<int, obs_location_t> 中的元素:

#include <iostream>
#include <map>

struct obs_location_t {
    int x;
    int y;
};

void removeLocations(std::map<int, obs_location_t>& locationMap) {
    // 使用迭代器遍历
    for (auto it = locationMap.begin(); it != locationMap.end(); ) {
        // 检查是否满足删除条件,例如:x 小于 0
        if (it->second.x < 0) {
            // 如果符合条件,使用 erase() 删除当前元素,并更新迭代器
            it = locationMap.erase(it); // erase 返回下一个有效的迭代器
        } else {
            ++it; // 移动到下一个元素
        }
    }
}

int main() {
    std::map<int, obs_location_t> locationMap;

    // 添加一些数据
    locationMap[1] = {10, 20};
    locationMap[2] = {-5, 15}; // 满足删除条件的元素
    locationMap[3] = {30, -10}; // 满足删除条件的元素

    removeLocations(locationMap);

    // 输出剩余的数据以验证结果
    for (const auto& pair : locationMap) {
        std::cout << "Key: " << pair.first << ", Location: (" 
                  << pair.second.x << ", " << pair.second.y << ")\n";
    }

    return 0;
}

说明:

  • 迭代器:我们使用 auto it 来声明迭代器,并从 locationMap.begin() 开始。
  • 删除操作:当发现要删除的元素时,调用 erase(it) 并将其返回值重新赋给 it,这样可以避免因修改容器而造成的无效访问。
  • 继续遍历:如果当前元素没有被删除,则通过 ++it 移动到下一个元素。

这样做确保了在遍历过程中安全地移除不需要的项,而不会引发未定义行为。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=18747

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?