【问题标题】:Iterating through STL classes in C++ 11 [duplicate]在 C++ 11 中迭代 STL 类 [重复]
【发布时间】:2016-04-26 18:31:27
【问题描述】:

假设我们有 std::map 并且我们想要迭代。这两次迭代之间有什么优点/缺点(或主要区别是什么)?

map<string,int> m0 { { "name1", 20 }, { "name2", 30 }, { "name3", 40 } };
for( auto &it : m0 )
    it = m0 . erase( it );

for (auto it=m0.begin(); it!=m0.end(); ) 
    it = m0.erase(it);

第一个代码不兼容,我不知道为什么,尽管在 cppreference 中的语法与第一个类似。

【问题讨论】:

  • for( auto &amp;it : m0 ) -- 尽管您将变量命名为“it”,但它实际上并不是一个迭代器,而是对映射元素的引用。
  • 第一个在循环中没有给你一个迭代器,它给你一个元素引用。你不能用它来删除。
  • m0.clear(); 有什么问题?

标签: c++ c++11 stl iterator


【解决方案1】:

使用基于范围的 for 循环只计算一次结束条件。带有迭代器的经典循环在每次迭代时对其进行评估。 基于范围的循环总是迭代整个容器。带有迭代器的经典循环只能迭代容器的一部分。 范围循环语法更简洁明了。

这些是我认为的主要区别。

【讨论】:

  • 还有一个使用迭代器,另一个直接给你元素。
  • 对否决票感到好奇。我的回答到底有什么问题?
猜你喜欢
  • 2019-09-29
  • 2013-08-18
  • 2015-01-10
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多