请问如果vector.erase()失败会怎样?

x_xy 2003-08-20 12:49:40
即要删除的元素不存在,会导致怎样的后果?会抛出异常吗?
...全文
189 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
x_xy 2003-08-26
  • 打赏
  • 举报
回复
郁闷,谢谢!
ark13 2003-08-23
  • 打赏
  • 举报
回复
在vector容器erase一个对象后,从erase之后的的所有iterator都将无效(大部分实作版本将使iterator指向下一个对象,例如删除n个对象,那么指向最后的n个对象的iterator将失效),因此如果你的程序在erase之后又访问一个无效的iterator,就有可能让程序崩溃。
ark13 2003-08-23
  • 打赏
  • 举报
回复
无法得知(因为vector的特殊性和实现上的简单性,有些实作版本可以用指针偏移量的办法进行判断,但标准并未承诺其可行性),因此只能通过人为地从逻辑上构造良好而安全的程序行为来确保iterator的有效性,例如:如果进行insert操作而引起vector重新分配内存,将导致从插入点之后所有的iterator失效!在写程序时必须时刻注意到这一点,并对其进行预防性处理。

vector的erase操作效率极低,因此如果要进行频繁的erase操作除非不得已否则应使用list代替

x_xy 2003-08-21
  • 打赏
  • 举报
回复
如何知道
x_xy 2003-08-21
  • 打赏
  • 举报
回复
那么如果怎么知道这个值是否有效呢?
ark13 2003-08-20
  • 打赏
  • 举报
回复
因为STL为了性能并没有对删除不在[first,last)区间的非法iterator的行为做出定义,并且不抛出异常,因此不同的编译器的行为是不同的,因此在删除之前必须确认iterator的合法性,不能依赖某一编译器的行为
x_xy 2003-08-20
  • 打赏
  • 举报
回复
容器存储的是个SOCKET,也就是int,应该没有什么异常会发生吧。
那怎么样来判断是不是失败了呢?
因为程序崩溃前的Log纪录是在这个vector的erase()执行之前,所以觉得很奇怪。
jyfcsdn 2003-08-20
  • 打赏
  • 举报
回复
前提:容器存储对象的析构函数不会抛出异常

对这种情况iterator erase(iterator it);
不会抛出异常,就是找不到罢了
对这种情况iterator erase(iterator first, iterator last);
只要保证[first, last)是有效区间就不会抛出异常,否则结果未定义

x_xy 2003-08-20
  • 打赏
  • 举报
回复
Both return an iterator that designates the first element remaining beyond any elements removed, or end() if no such element exists.
这里没说删除错了会怎么样吧?只是说删除后的返回iterator是指向被删除的元素的之前的那个,如果那个元素不存在,就返回end()吧?
jyfcsdn 2003-08-20
  • 打赏
  • 举报
回复
不会的,erase 的规格如下,看最后一句话

vector::erase
iterator erase(iterator it);
iterator erase(iterator first, iterator last);
The first member function removes the element of the controlled sequence pointed to by it. The second member function removes the elements of the controlled sequence in the range [first, last). Both return an iterator that designates the first element remaining beyond any elements removed, or end() if no such element exists.

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧