这样做不安全
resize()函数可以改变向量的大小,并把一些元素初始化为适当类型的0或以无参构造初始化,被减少的类类型元素将引发析构。
如果是简单类型,你resize()减少元素个数,减少的部分可能被保留,就向你现在的情况,但是如果有后续的push_back操作,就可能会覆盖后面的数据了,resize之后相当于使得改变有效数据的范围,只有在size内的才安全,size外的不受保护,随时可能被覆盖,如果你在a.resize(5)后面执行一次a.push_back,那么a[5]的值就被覆盖了
如果是类类型,那就更加不行了,类类型直接析构,即使你没有覆盖操作,数据也可能消失了,举例如下
程序代码:
#include <deque>
#include <iostream>
#include <algorithm>
using namespace std;
class A {
public:
A (void) {
cout << "A无参:" << this << endl;
}
A (string str, int n):m_str(str),m_n(n) {
cout << "A构造:" << this << endl;
}
A (const A& a) {
m_str=a.m_str;
m_n=a.m_n;
cout << "A拷贝:"<<&a<<" -> "<<this<< endl;
}
~A (void) {
cout << "A析构:" << this << endl;
}
friend ostream& operator << (ostream& os,const A& a) {
return os << '(' << a.m_str << ", " << a.m_n << ')';
}
private:
string m_str;
int m_n;
};
int main (void) {
int i;
deque<int> di;
di.push_back (0);
di.push_back (1);
di.push_back (2);
di.push_back (3);
di.push_back (4);
di.resize(3);
for(i=0; i<5; i++)
{
cout << di[i] << endl;
}
deque<A> da;
da.push_back(A("Tom",0));
da.push_back(A("Jim",1));
da.push_back(A("Lily",2));
da.push_back(A("Lucy",3));
da.push_back(A("Jack",4));
da.resize(3);
for(i=0; i<5; i++) {
cout << da[i] << endl;
}
return 0;
}
[
本帖最后由 tongzhipeng 于 2012-5-5 00:12 编辑 ]