C++ std::map erase() 和迭代器詳解:常見面試陷阱與深入理解

在使用 C++ 的 std::map 時,配合 erase() 和迭代器的使用是一個經典面試點,也是實際開發中經常出錯的地方。本文將深入講解 erase() 的行為、end() 的本質以及迭代器失效規則,幫助你寫出更健壯的代碼。

1. erase(it) 的行為

當你使用 erase(it) 刪除一個迭代器指向的元素時:

it = myMap.erase(it);

這行代碼的效果是:

  • 刪除當前迭代器 it 指向的元素;

  • 返回一個指向 下一個元素 的迭代器。

如果 it 是最后一個元素呢?

  • erase(it) 會返回 map.end(),表示迭代器已到達末尾。

std::map<int, std::string> m = {{1, "a"}, {2, "b"}};
auto it = std::prev(m.end());  // 指向 key=2
it = m.erase(it);              // 刪除 key=2
// 現在 it == m.end()

2. map.end() 是什么?

  • map.end() 是一個迭代器,表示 容器末尾之后的位置

  • 你不能對其進行解引用(*it)或遞增(++it)。

  • 它常用于循環終止條件:

for (auto it = m.begin(); it != m.end(); ++it) {// 處理元素
}

3. 面試常問陷阱:刪除時如何避免跳過元素?

很多人在遍歷過程中刪除元素時容易出錯。例如:

? 錯誤寫法:

for (auto it = m.begin(); it != m.end(); ++it) {if (shouldDelete(it->first)) {m.erase(it);  // 危險:it 失效后 ++it 會崩潰}
}

? 正確寫法:使用 erase() 的返回值

for (auto it = m.begin(); it != m.end(); ) {if (shouldDelete(it->first)) {it = m.erase(it);  // 刪除并跳到下一個} else {++it;}
}

4. erase 不會導致全部迭代器失效

  • 刪除某個元素只會讓 指向被刪元素的迭代器失效

  • 其他迭代器仍然有效。

這意味著你可以安全地遍歷和刪除,只要你不在刪除后繼續使用原來的迭代器

5. 總結

情況說明
it = map.erase(it)刪除并前進到下一個
刪除末尾元素erase() 返回 end()
end() 的意義一個不指向任何元素的“哨兵”
迭代器失效規則只有被刪元素的迭代器失效

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916843.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

求職招聘小程序源碼搭建招聘小程序開發定制人力資源系統

身份&#xff1a;求職者、企業求職者&#xff1a;完善簡歷&#xff0c;簡歷投遞企業&#xff1a;企業入駐&#xff0c;查看簡歷企業會員&#xff1a;半年 、年度 權益&#xff1a;每日發布條數、刷新條數&#xff0c;簡歷下載數量聊天&#xff1a;求職者可以和企業聊天招聘會…

【31】C# WinForm入門到精通 ——保存文件SaveFileDialog 【屬性、方法、事件、實例、源碼】

WinForm 是 Windows Form 的簡稱&#xff0c;是基于 .NET Framework 平臺的客戶端&#xff08;PC軟件&#xff09;開發技術&#xff0c;是 C# 語言中的一個重要應用。 .NET 提供了大量 Windows 風格的控件和事件&#xff0c;可以直接拿來使用。 本專欄內容是按照標題序號逐漸…

socket網絡編程(1)

socket網絡編程&#xff08;1&#xff09; 設計echo server進行接口使用 生成的Makefile文件如下 .PHONY:all all:udpclient udpserverudpclient:UdpClient.ccg -o $ $^ -stdc17 -static udpserver:UdpServer.ccg -o $ $^ -stdc17.PHONY:clean clean:rm -f udpclient udpserver…

數據集:機器學習的基石

三、數據集&#xff1a;機器學習的基石1. sklearn 玩具數據集&#xff1a;快速入門的理想選擇1.1 玩具數據集的特點與價值sklearn 內置的玩具數據集&#xff08;Toy Datasets&#xff09;是機器學習入門的絕佳資源。這類數據集通常具有以下特點&#xff1a;數據量小&#xff1a…

SQL排查、分析海量數據以及鎖機制

1. SQL排查 1.1 慢查詢日志: mysql提供的一種日志記錄, 用戶記錄MySQL中響應時間超過閾值的SQL語句(long_query_time, 默認10秒), 慢查詢日志默認是關閉的, 建議開發調優時打開, 最終部署的時候關閉 1.1.1 檢查是否開啟了慢查詢日志 show variables like %slow_query_log%;臨…

conda 安裝prokka教程

本章教程,記錄如何在wsl2+ubuntu下載通過conda安裝prokka軟件包。 Prokka 是一個快速的、功能強大的基因組注釋工具,特別適用于細菌基因組的注釋。它能夠自動化完成從基因組序列到功能注釋的整個流程,包括基因的識別、功能預測和注釋,并且支持多種文件格式輸出,廣泛應用于…

CSS3 圓角

CSS3 圓角 引言 CSS3圓角是現代網頁設計中非常重要的一項功能&#xff0c;它使得網頁元素的外觀更加平滑、美觀。本文將詳細介紹CSS3圓角的概念、實現方法以及相關屬性&#xff0c;幫助您更好地掌握這一技巧。 CSS3圓角概念 CSS3圓角指的是通過CSS3屬性為元素&#xff08;如div…

牛頓-拉夫森法求解非線性方程組

牛頓-拉夫森法&#xff08;Newton-Raphson method&#xff09;是一種用于求解非線性方程組的迭代方法。該方法通過線性化非線性方程組&#xff0c;并逐步逼近方程組的解。以下是牛頓-拉夫森法求解非線性方程組的詳細步驟和MATLAB實現。 1. 牛頓-拉夫森法的基本原理 對于非線性方…

Windows系統使用命令生成文件夾下項目目錄樹(文件結構樹)的兩種高效方法

Windows系統使用命令生成文件夾下項目目錄樹&#xff08;文件結構樹&#xff09;的兩種高效方法前言&#xff1a;**方法一&#xff1a;tree 命令 —— 快速生成經典目錄樹****方法二&#xff1a;PowerShell —— 可以精準過濾“降噪”的命令**這份列表非常精煉&#xff0c;只包…

react中暴露事件useImperativeHandle

注&#xff1a;本頁面模塊主要是使用 useImperativeHandle &#xff0c;一、概述1、要點hooks 中的暴露事情件方法useImperativeHandle&#xff0c;需要和forwardRef、ref 結合一起使用。1、外層校驗的時候會校驗里面所有需要校驗的驗證2、基礎使用二、demo案例1、場景1、彈框打…

【論文閱讀】-《RayS: A Ray Searching Method for Hard-label Adversarial Attack》

RayS&#xff1a;一種用于硬標簽對抗攻擊的光線搜索方法 Jinghui Chen University of California, Los Angeles jhchencs.ucla.edu Quanquan Gu University of California, Los Angeles qgucs.ucla.edu 原文鏈接&#xff1a;https://arxiv.org/pdf/2006.12792 摘要 深度神經…

15K的Go開發崗,坐標北京

好久沒有分享最新的面經了&#xff0c;今天分享一下北京某公司Go開發崗的面經&#xff0c;薪資是15K左右&#xff0c;看看難度如何&#xff1a; 為什么要用分布式事務 分布式事務的核心作用是解決跨服務、跨數據源操作的數據一致性問題。在單體應用中&#xff0c;數據庫本地事務…

Linux 文件管理高級操作:復制、移動與查找的深度探索

目錄一、文件復制&#xff1a;從基礎到企業級同步的全維度解析1. cp命令&#xff1a;基礎工具的進階密碼&#xff08;1&#xff09;文件屬性保留&#xff1a;從基礎到極致&#xff08;2&#xff09;特殊文件處理&#xff1a;稀疏文件與設備文件&#xff08;3&#xff09;安全操…

Redis內存使用耗盡情況分析

目錄 1、內存上限介紹 1.1、產生原因 1.2、Redis的maxmemory限額 1.3、影響的命令與場景 2. 內存用完后的策略 2.1、淘汰策略分類 2.2、淘汰策略介紹 2.3、不同策略對比 3、常見業務示例 3.1、影響 3.2、監控與自動告警 前言 在日常項目中&#xff0c;不知道你思考過…

Ubuntu 系統中配置 SSH 服務教程

一、什么是 SSH&#xff1f;SSH&#xff08;Secure Shell&#xff09;是一種加密的網絡協議&#xff0c;用于在不安全的網絡中安全地進行遠程登錄、遠程命令執行和文件傳輸。它是 Telnet、FTP 等傳統協議的安全替代品。二、確認系統環境在開始配置之前&#xff0c;請確認你的系…

基于springboot的編程訓練系統設計與實現(源碼+論文)

一、開發環境 技術/工具描述MYSQL數據庫一個真正的多用戶、多線程SQL數據庫服務器&#xff0c;適用于Web站點或其他應用軟件的數據庫后端開發。B/S結構基于互聯網系統的軟件系統開發架構&#xff0c;利用瀏覽器進行訪問&#xff0c;支持多平臺使用。Spring Boot框架簡化新Spri…

K8s集群兩者不同的對外暴露服務的方式

在工作中&#xff0c;我們暴露集群內的服務通常有幾種方式&#xff0c;對于普通的http或者https,我們通常使用?Ingress Nginx? &#xff0c;對于原始的TCP或者UDP端口服務&#xff0c;可能需要選擇 ?LoadBalancer? &#xff0c;它們的核心區別在于工作層級、協議支持和流量…

實習日志111

第一天 加入內網和內網域&#xff0c;設置自己的操作系統 第二天 安裝常用軟件和平臺 Notepad 是一款免費的源代碼編輯器&#xff0c;支持多種編程語言&#xff0c;其功能強大且界面友好&#xff0c;適用于 Windows 操作系統。WinMerge 是一款開源的差異比較和合并工具&…

Redis 服務掛掉排查與解決

Redis 是一個高性能的鍵值對存儲系統&#xff0c;廣泛應用于緩存、會話存儲、消息隊列等場景。在使用 Redis 的過程中&#xff0c;偶爾會遇到 Redis 服務掛掉或無法連接的情況。本文將通過常見錯誤 RedisException in Redis.php line 63 Connection refused 來講解如何排查并解…

DOM + HTML + HTTP

一、HTML5的新特性 1.語義化標簽:其實就是可以讓標簽有自己的含義 html4之前都是有的,比如:<h1>、<ul>、<li> html5新增了很多語義化標簽:<header>、<nav> html5的語義化標簽的常用頁面布局: 優點: 1.代碼結構清晰,方便閱讀,有利于團…