推荐用for (const auto& p : my_map)遍历map,简洁安全;key为const不可修改,value可改;遍历时禁止增删,否则迭代器失效。

用for-range循环遍历map最简洁
现代C++(C++11起)推荐直接用范围for,代码干净、不易出错。map的每个元素是std::pair<const key value></const>类型,所以解构时key要加const修饰。
常见错误是写成auto& p : my_map后误用p.first = ...——key是const,赋值会编译失败;若只想读,用const auto&更安全。
std::map<:string int> m = {{"a", 1}, {"b", 2}};
for (const auto& p : m) {
std::cout
<h3>用迭代器遍历时注意operator++的语义</h3>
<p><code>std::map</code>迭代器是双向迭代器,支持<code>++it</code>和<code>--it</code>,但不支持<code>it + 5</code>这类随机访问操作。遍历时若需修改value,可用<code>it->second</code>;但不能改<code>it->first</code>,否则破坏红黑树结构。</p>
<ul>
<li>错误写法:<code>it->first = "new_key"</code> → 编译失败或未定义行为</li>
<li>正确写法:<code>it->second = 42</code> → 允许,只改value</li>
<li>想按反序遍历?用<code>std::map::rbegin()</code>/<code>rend()</code>,不是<code>--end()</code>手动倒推</li>
</ul>
<h3>遍历时插入/删除元素会失效迭代器</h3>
<p><code>std::map</code>在插入新键时可能触发树重平衡,导致已有迭代器失效;删除当前迭代器指向的元素后,该迭代器立即失效——这是最容易踩的坑。</p>
<p>安全做法:删除前先保存下一个位置。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img
src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a>
<p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<pre class="brush:php;toolbar:false;">for (auto it = m.begin(); it != m.end(); ) {
if (it->second
<p>不要写<code>m.erase(it++);</code>——虽然常见,但C++标准不保证<code>it++</code>的副作用在<code>erase</code>调用前完成,有潜在风险。</p>
<h3>需要按插入顺序遍历时map不行,得换容器</h3>
<p><code>std::map</code>按key排序,不是插入顺序。如果业务逻辑依赖“谁先插谁在前”,别硬套map遍历——它天生不支持。</p>
<p>可选方案:</p>
- 用
std::vector<:pair value>></:pair>+ 手动查找(小数据量够用) - 用
std::unordered_map配额外的std::vector<key></key>记录顺序(查快、遍历可控) - C++17起可考虑
boost::multi_index_container,但引入依赖要权衡
试图用map模拟插入序,最后总会在某次迭代里发现key被重排,然后花半天找为什么输出顺序不对。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










