首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么g ++ 4.0版本的map <T> :: erase(map :: <T> iterator)不返回迭代器?

为什么g ++ 4.0版本的map <T> :: erase(map :: <T> iterator)不返回迭代器?
EN

Stack Overflow用户
提问于 2019-06-24 02:32:14
回答 2查看 0关注 0票数 0

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

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

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

itor = m_ResourceMap.erase(itor);

在GCC 4.0中,擦除函数返回void,所以我不能这样做。这是否意味着以下映射元素向后移动,因此迭代器自动指向下一个元素,或者这是否意味着我必须在之后增加迭代器?该 在线文档STL是不是关于这个问题的非常简洁的XCode似乎并没有什么。

谢谢你的帮助,

阿德里安

EN

回答 2

Stack Overflow用户

发布于 2019-06-24 11:27:25

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

代码语言:javascript
复制
m_ResourceMap.erase(itor++);

擦除无效的迭代器,因此您不能在之后递增它。

票数 0
EN

Stack Overflow用户

发布于 2019-06-24 11:51:21

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档