【问题标题】:c++11: erase using a const_iteratorc++11:使用 const_iterator 擦除
【发布时间】:2013-04-05 22:57:42
【问题描述】:

我相信从 C++11 开始,大多数容器的 erase 函数(例如 std::vector)都接受 const_iterator 作为参数:

iterator erase (const_iterator position);

即使使用--std=c++11 编译,我的编译器(GCC 4.8 和 Clang 3.2,都使用 GCC libstdc++)仍然不允许我使用这样的函数。

这是编译器/libstdc++ 错误,还是我做错了什么?这是一个示例代码:

#include <vector>

int main( )
{
    std::vector<int> v;
    v.push_back( 1 );
    v.push_back( 2 );
    v.push_back( 3 );

    std::vector<int>::const_iterator i = v.begin();
    while( i != v.end() ) {
        i = v.erase( i );
    }

    return 0;
}

【问题讨论】:

  • 这似乎是标准库实现的问题,而不是编译器本身
  • @Andy:是的,如果不是我的错,很可能是 libstdc++。我仍然很惊讶这是 libstdc++(或编译器,无论如何)的问题,因为我可以找到许多关于擦除 const_iterator 的问题,但所有都早于 C++ 11...

标签: c++ c++11 stdvector erase const-iterator


【解决方案1】:

此问题已记录在 here,目前报告为部分实现。

CTRL + F 使用浏览器搜索N2350

如果您使用的是 Linux,则可以从 LLVM 项目构建 libcxx 库的开发版本,您可以从 here 下载该库;我不知道这是否能解决您遇到的任何问题,但我建议将其作为libstdc++ 的替代方案。

【讨论】:

  • 你说得对,我错过了。不过,这很奇怪,关于这个功能有很多问题(在 SO 和整个网络上),但没有一个解决它在 libstdc++... 中的缺失
  • 这个问题现在解决了吗? (2014 年 6 月?)
  • @JonathanLeaders:我刚刚看到你的消息。是的,现在已经修复了。
猜你喜欢
  • 1970-01-01
  • 2011-06-20
  • 2016-11-11
  • 1970-01-01
  • 2013-09-30
  • 2013-12-16
  • 1970-01-01
  • 2013-03-17
  • 2014-02-21
相关资源
最近更新 更多