【g++bug】 vector.erase (const_iterator)调用报错

报错如下:no matching function for call to ‘std::vector<TYPE>::erase(__gnu_cxx::__normal_iterator<const int*, std::vector<TYPE> >&)’

               v.erase(e);

原因:g++未实现这个接口,但c++11标准定义了这个接口,算编译器bug。g++4.9.0修正。

详情:

         1、接口定义如下,参见http://www.cplusplus.com/reference/vector/vector/erase/

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

2、bug反馈如下,参见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54577

Bug 54577  deque<T>::erase() still takes iterator instead of const_iterator
Status:RESOLVED FIXED
 
Alias:None
 
Product: gcc
Component: libstdc++ (show other bugs)
Version:4.6.1
 
:P3 normal
Target Milestone:4.9.0
Assignee:Paolo Carlini
 
URL:
Keywords:  
 
: 55675 57158 (view as bug list)
Depends on:
Blocks:
 
Reported:2012-09-14 01:06 UTC by thunderliu
Modified:2013-05-10 15:19 UTC (History)
4 users (show)
 
See Also:  
Host:  
Target:  
Build:  
Known to work:  
Known to fail:  
Last reconfirmed: 2013-05-03 00:00:00

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`std::vector::erase`是C++标准库中的一个方法,用于从vector中删除指定的元素。其基本用法如下: ```cpp std::vector<int>::iterator erase(const_iterator position); ``` 或者 ```cpp void erase(const_iterator first, const_iterator last); ``` 第一个版本删除一个元素,第二个版本删除一个范围。这些方法都返回一个指向被删除元素之后的元素的迭代器。注意,对于指向元素开始和结束的迭代器,通常定义为常量(即它们是不可变的),这就是为什么这里使用了`const_iterator`的原因。 下面是`erase`的用法和实例: 1. **删除一个元素**: ```cpp std::vector<int> vec = {1, 2, 3, 4, 5}; vec.erase(vec.begin() + 2); // 删除索引为2的元素(即3) ``` 2. **删除一个范围的元素**: ```cpp std::vector<int> vec = {1, 2, 3, 4, 5}; vec.erase(vec.begin() + 2, vec.begin() + 4); // 删除索引为2和3的元素(即3和4) ``` 请注意,被删除的元素会被移动到vector的末尾,所以它们的索引不会改变。也就是说,如果一个元素被删除,它原来的位置将会是下一个元素的空位。因此,如果你需要保留这些被删除元素的引用或指针,那么你需要在删除它们之前保存这些引用或指针。 此外,你还可以使用`std::vector::clear`方法来清除vector中的所有元素,但是这不会改变vector的大小。 希望这个回答对你有所帮助!如果你有任何其他问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值