【问题标题】:Why does the g++ 4.0 version of map<T>::erase(map::<T> iterator) not return a iterator?为什么 g++ 4.0 版本的 map<T>::erase(map::<T> iterator) 不返回迭代器?
【发布时间】:2010-10-04 12:47:00
【问题描述】:

我正在将一个中型 C++ 项目从 Visual Studio 2005 移植到 MacOS、XCode / GCC 4.0。

我刚刚偶然发现的差异之一与从地图中删除元素有关。在 Visual Studio 中,我可以擦除由迭代器指定的元素并将返回值分配给迭代器以获取下一个元素的位置。这样迭代器在擦除后不会指向某个无效地址。

换句话说,在 Visual Studio 中我可以这样做:

itor=m_ResourceMap.erase(itor);

在 GCC 4.0 中,擦除函数返回 void,所以我不能这样做。这是否意味着以下地图元素向后移动,因此迭代器自动指向下一个元素,或者这是否意味着我必须在之后增加迭代器? online STL Documentation 在这个主题上不是很简洁,XCode 似乎也没有。

感谢您的帮助,

阿德里安

【问题讨论】:

标签: c++ gcc stl


【解决方案1】:

我相信,erase() 的 C++ 标准库实现的 DinkumWare 实现被定义为在要删除的元素之后返回迭代器。这也让我感到难过,当我向 DinkumWare 询问这件事时,他们说这是一个“符合标准的扩展”。

有一些 STL 容器(例如向量),当您执行插入或擦除操作时,可能会使该容器的所有迭代器失效。我不记得地图是否是其中之一,但如果是,则您在循环中擦除地图元素的方法存在潜在的潜在漏洞。

【讨论】:

【解决方案2】:

从外观上看,gcc 遵循 STL 标准,所以我想您必须更改代码。

void erase(iterator pos)     Associative Container  Erases the element pointed to by pos. 

【讨论】:

【解决方案3】:

没有。您必须在擦除之前增加迭代器。像这样

m_ResourceMap.erase(itor++);

迭代器被擦除失效,所以你不能在之后增加它。

【讨论】:

  • 我试图理解语法。 itor++ 是一个后缀增量,所以它会擦除 itor,然后它应该是无效的,不是吗?
  • 后缀:递增然后返回迭代器曾经指向的值。这个值会被删除。
猜你喜欢
  • 1970-01-01
  • 2020-12-13
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多