用常量迭代器从STL容器中擦除

Erasing from an STL container by a constant iterator

本文关键字:擦除 STL 常量 迭代器      更新时间:2023-10-16

根据c++参考STL容器在c++ 11标准中被固定为在erase方法中使用常量迭代器。以下代码在启用c++0x的g++4.7中无法编译。

#include <vector>
int main()
{
    std::vector<int> vector;
    vector.push_back(0);
    std::vector<int>::const_iterator vectorItr = vector.begin();
    vector.erase(vectorItr);
}

显然新的签名没有实现。请问这个问题什么时候能解决?

在GCC的c++ 0x/c++ 11支持文章中我找不到任何相应的信息。

In HERE:

: 23.3.6
描述:类模板向量
状态:部分
注释:插入和擦除成员不接受const_iterator参数(N2350)。

对于它的价值:我已经对GCC 4.8.1以及GCC 4.9(20130602快照)进行了测试,结果是4.8.1仍然存在这个问题(请注意,承诺的c++ 11遵从性与语言核心有关,而不是标准库),但是4.9快照正确编译它。

所以我想假设GCC 4.9一旦发布,将按照标准指定的方式处理这个问题是公平的。

查看gcc的库实现状态。在这里,它清楚地说明了所讨论的功能尚未实现:

23.3.6 -类模板vector - Partial - insert和erase成员不接受const_iterator实参(N2350)。

不出所料:因为它似乎还没有实现(即使在c++ 11模式下)。

最简单的检查方法是查看std::vector的底层实现。尽管大多数方法签名可能相当晦涩难懂,但方法签名通常很容易阅读。

在GCC 4.8中给出了完整的c++ 11兼容性(而不是4.7)。

由于4.7未被授予完全兼容,因此不能将其视为(严格的技术术语)"错误"。可能是需要与其他尚未兼容的库模块保持一定的兼容性。

如果这发生在4.8中,那么它必须被认为是一个bug。但不是在4.7