我正在将一个中型C ++项目从Visual Studio 2005移植到MacOS,XCode / GCC 4.0。
我偶然发现的一个差异与从地图中删除元素有关。在Visual Studio中,我可以擦除迭代器指定的元素,并将返回值赋给迭代器以获取下一个元素的位置。这样,迭代器在擦除后不会指向某个无效地址。
换句话说,在Visual Studio中我可以这样做:
itor = m_ResourceMap.erase(itor);
在GCC 4.0中,擦除函数返回void,所以我不能这样做。这是否意味着以下映射元素向后移动,因此迭代器自动指向下一个元素,或者这是否意味着我必须在之后增加迭代器?该 在线文档STL是不是关于这个问题的非常简洁的XCode似乎并没有什么。
谢谢你的帮助,
阿德里安
发布于 2019-06-24 11:27:25
不。在擦除之前必须增加迭代器。像这样
m_ResourceMap.erase(itor++);
擦除无效的迭代器,因此您不能在之后递增它。
发布于 2019-06-24 11:51:21
我相信,擦除()的C ++标准库实现的DinkumWare实现被定义为在要删除的元素之后返回迭代器。这也是我的一点,当我问DinkumWare时,他们说这是一个“符合标准的扩展”。
有一些STL容器(例如向量),当您执行插入或擦除操作时,可能会使该容器的所有迭代器无效。我不记得地图是否是其中之一,但如果是,则在循环中擦除地图元素的方法可能存在潜在的隐患。
https://stackoverflow.com/questions/-100001276
复制相似问题