Vector pop_back

自己今天碰到的问题:

typedef struct ReadFileOffsettag
{
            int  time;
            LONG offset;


}ReadOffset;

 

 

vector<ReadOffset> StoreEachReadInfoVec

 

(第一种方法)

vector <ReadOffset>::iterator iter,iend; //起始和末尾迭代器值


iend = StoreEachReadInfoVec.end();

int j;
for (iter = StoreEachReadInfoVec.begin(),j = 0;iter != iend; /*iter++,*/j++)
{
           if (CurrentRead.offset == iter[j].offset)       
//比较若相等就把此项对应的offset赋值给CurrentRead.offset,删除下一项
           {
                     CurrentRead.offset = iter[j].offset;
                     StoreEachReadInfoVec.erase(iter + j);
           }

}


#if 0(第二种方法)
 int size = StoreEachReadInfoVec.size();

 for(int i = 0;i < StoreEachReadInfoVec.size() ;i++)
 {
         int offsettt = StoreEachReadInfoVec[i].offset;
         if (CurrentRead.time == StoreEachReadInfoVec[i].time)
         {
                     CurrentRead.offset = StoreEachReadInfoVec[i].offset;
                     //StoreEachReadInfoVec.erase();
                     StoreEachReadInfoVec.pop_back();
           }
 }
#endif

 

 

Google:

http://www.programfan.com/club/showpost.asp?id=16874

 

vector中删除元素的问题

我想在vector中删除某个元素,用erase()吗,
顺便iterator是什么类型的的,我很迷惑,谢谢指点!
  
 回复内容
【flyingpig4945】:
删除元素:c.erase(p)
其中p为指向容器的迭代器,即vector<type>::iterator
迭代器(iterator)是一种检查容易内元素并遍历元素的数据类型
若一种类型支持一组确定的操作(该操作可以用来遍历容器内的元素,并访问这些元素的值),则称为类型为容器。
基本上可以这样理解,迭代器和容易的关系很像指向某数据类型的指针和数据类型本身。
比如:int 和 int *,vector<type> 和 vector<type>::iterator

【chenyu2202863】:
楼上说的很清楚了~
不明白这些你可以看看C++PRIMER上的第9章

【cmail】:
vector的iterator实际上就是一种原生指针.
如果 vector<int>,则ierator其实就是int*

temlate<class T, ...>
class vector
{
public:
typedef T value_type;
typedef value_type* iterator;
typedef const value_type* const_iterator;
...
};

【expter】:
哦...就是

【seablue1023】:
忠心感谢个位.

 

http://blog.vckbase.com/panic/archive/2005/08/05/10513.aspx

vector::pop_back,错误延迟发生

作者: Panic  2005年8月5日

pop_back是vector中一个不常用的成员函数,功能是销毁并抛弃vector的最后一个元素。

msdn已经明确要求调用这一函数的vector必须非空。但是如果对空vector调用会发生什么呢?

pop_back调用一般并不会引起程序立刻异常或崩溃,vector只是简单的把存储区前面的一段内存看作一个“元素”,对它调用析构函数,然后尾迭代器向前移动1。

由于存储区的前一段内存一般而言也是有效的,可访问的空间,所以这个操作可能只是修改了不应该修改的数据而已。一般不会立刻发现问题。

那么问题在什么时候发生呢?析构的时候!

析构的时候,vector销毁首元素,然后增加首迭代器直到它等于尾。但是由于前面的pop_back,尾迭代器位置前移,在最开始就已经等于甚者小于首。所以这个移动其实是对后面内存空间的一次大清理。程序会因此长时间失去响应。

而当vector是一个临时变量(栈对象)的时候,因为栈对象清理的工作是在后台操作,所以在我们看来往往是函数退出的时候突然死掉了。

因为错误发生的地点和检查到错误的地点相隔比较远,所以这无疑是一个比较难找的错误。

解决方法:
方法1,修改vector的实现代码,在pop_back中加入断言。这么做一劳永逸,不过很多人不愿意:P
方法2,调用pop_back前进行断言或者判断。这个完全靠使用者自觉。
方法3,避免在代码中调用pop_back。嗯,好办法--b

Feedback

理解为什么会说:vector为empty了pop_back出错。(程序员都喜欢写一致性的代码)

所有的容器只要empty了,对它们的元素操作都会出错。这一点还必须遵守设计者的要求,C/C++里要强行搞死什么东西,都不是很难的事。

在C++里,大多数使用限制都是靠自觉的;不过,一般的设计者都应改进行基本的断言判断,只是一般用于入参的检测。

所以,个人觉得应该是:
“方法2”最好,最符合用C++;
“方法1”实现者没有assert也可以理解和无可厚非;
“方法3”可能是作者自己过头了。

2005-08-13 23:37 by Zhuyie
感觉这个行为不是标准确定的,而是实现相关的;或许换一个不同的STL实现就会有不同的行为。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值