vector容器的erase方法???????

scott_2009 2009-03-21 04:41:31
SGI STL对vector容器的erase()方法是这样实现的。
iterator erase(iterator first, iterator last) {
iterator i = copy(last, finish, first);//移动删除区间后面的元素
destroy(i, finish);//调用容器内元素的析构函数
finish = finish - (last - first);
return first;
}
假如我们容器中的元素是一些指向类的指针,如Vector<Myclass *> MyClassVector;
而Myclass申请了堆内存,需要调用Myclass的析构函数释放内存。那么这时候我们调用MyClassVector
容器的erase(iterator first, iterator last)函数之前一定要先遍历这段区间取出容器中的元素,
调用元素的析构函数,否则会内存泄漏。
我觉得这个erase函数设计的是不是有问题呢?如果改成这样不是更好么?
iterator erase(iterator first, iterator last) {
destroy(i, finish);//调用容器内元素的析构函数,先释放掉不需要的元素的内存
iterator i = copy(last, finish, first);//移动删除区间后面的元素
finish = finish - (last - first);
return first;
}
请高人帮忙解惑为什么SGI STL要这样设计erase函数呢?
...全文
435 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzonline01 2009-03-22
  • 打赏
  • 举报
回复
vector内存申请的空间只有当不够用的时候才会申请一个原来二倍的内存空间,并将原来的值铐过去,然后释放原来的内存,删除元素是不可能改变其内存的只是改变几个标记指针的位置,
liqinghua1653 2009-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 scott_2009 的回复:]
引用 6 楼 liqinghua1653 的回复:
首先你要知道vector设计原理, 在内存中他们是连续分布的。 当要把中间某一段删除的时候, 一般是把后面向前移动, 在释放后面空出来的内存。这样高效的多。 就像一个数组

貌似vector在删除元素的时候没有释放内存,只是调整了start,finish指针的位置。
顶起。。。请帮忙解惑。
[/Quote]
一般情况设vector申请一段空间, 之后所有事情都是在这个空间操作。 如果之后发现空间不足, 就从新开辟一块, 把已有的数据copy到新家。
在删除的时候只是销毁了相应的对象, 但是空间还是保留这的, 这样之后插入对象的时候就可以重复利用了。

其实这个可以用一个动态数组来解释,vertor的数据就相当于你数组上保存的东西, 当然你可以随便放多上个数据, 只要你维持好最后位置就可以了。 首先你申请一个数组。 在你重新申请一个之前这个数组的空间一直存在, 尽管你的数据没有数组空间多。 如果你的数据比数组空间要大,你就要重新申请一个更大的数组了, 在copy完数据之后释放掉以前的数组。

这个和vertor是一样的, 你可以看看源代码。

ypb362148418 2009-03-22
  • 打赏
  • 举报
回复
写个容器的使用,然后转到定义去,就可以看到了
iambic 2009-03-21
  • 打赏
  • 举报
回复
请楼主先从正规文档中找出std::vector::erase的规范。

先说清楚erase是干什么的。
然后说你从源码中看到的是什么。
然后解释下这两者是不是矛盾。
最后说下你自己认为哪里不妥。

能做完这四步估计你也就没什么疑惑了。
scott_2009 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liqinghua1653 的回复:]
首先你要知道vector设计原理, 在内存中他们是连续分布的。 当要把中间某一段删除的时候, 一般是把后面向前移动, 在释放后面空出来的内存。这样高效的多。 就像一个数组
[/Quote]
貌似vector在删除元素的时候没有释放内存,只是调整了start,finish指针的位置。
顶起。。。请帮忙解惑。
liqinghua1653 2009-03-21
  • 打赏
  • 举报
回复
首先你要知道vector设计原理, 在内存中他们是连续分布的。 当要把中间某一段删除的时候, 一般是把后面向前移动, 在释放后面空出来的内存。这样高效的多。 就像一个数组
scott_2009 2009-03-21
  • 打赏
  • 举报
回复
Sorry,是让它给弄糊涂了。
应该是这样。
iterator erase(iterator first, iterator last) {
destroy(first, last);//调用不要元素的析构函数
copy(last, finish, first);//移动删除区间后面的元素
finish = finish - (last - first);
return first;
}
首先我觉得这样改比以前的好,其次我觉得在erase中不应该调用元素的析构函数。
毕竟容器只是暂时的保存元素,元素的创建和销毁不应该由容器负责。请高手帮忙解答。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chenzhp 的回复:]
C/C++ codeiterator erase(iterator first, iterator last) {
destroy(i, finish);//这样写的话,destroy里面的i从何而来啊?
iterator i = copy(last, finish, first);//移动删除区间后面的元素
finish = finish - (last - first);
return first;
}
[/Quote]

楼主糊涂了?
feng4206yu 2009-03-21
  • 打赏
  • 举报
回复
该函数应该会调用MyClass的析构函数...只要你在自己的析构函数中释放内存解决好就OK...(应该是这样的)
frank529 2009-03-21
  • 打赏
  • 举报
回复
你把i到finish的内存都释放掉了还怎么copy啊?
chenzhp 2009-03-21
  • 打赏
  • 举报
回复
iterator erase(iterator first, iterator last) { 
destroy(i, finish);//这样写的话,destroy里面的i从何而来啊?
iterator i = copy(last, finish, first);//移动删除区间后面的元素
finish = finish - (last - first);
return first;
}

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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