擦除std :: tr1 :: unordered_map中的元素

cac*_*hed 3 c++ unordered-map

我们可以使用前向迭代来擦除unordered_map中的元素吗?

unordered_map<string, int> employeeTable;
unordered_map<string, int>::iterator it;

for (it = employeeTable.begin(); it != employeeTable.end();) {
   int age = it->second;
   if (age < 18) {
      employeeTable.erase(it++);
   } else {
      ++it;
   }
}
Run Code Online (Sandbox Code Playgroud)

如果以上不正确,标准推荐什么?像下面的东西

it = employeeTable.erase(it);
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 6

根据6.3.1 [tr.unord.req]第12段:

...擦除成员只能使迭代器和对擦除元素的引用无效.

也就是说,上面的代码应该没问题.

  • 实际上,需要在`erase()`之前计算表达式`it ++`,因为``++`的结果需要作为`erase()的参数.因此,迭代器在`erase()`之前递增并保持有效或成为`employeeTable.end()`.因此,代码没问题. (4认同)