一个vector的问题

redshiliu 2011-05-04 09:00:54

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

ofstream out("out.txt");

class Rock
{
public:
Rock() {out<<"Rock()\n";}
Rock(const Rock& r) {out<<"Rock(const Rock&)\n";}
~Rock() {out<<"~Rock()\n";}
const Rock& operator=(const Rock& r)
{
out<<"operator=\n";
return r;
}
};

int main(int args,char* argv[])
{
vector<Rock> vr;
Rock* pr=new Rock[5];
for (int i=0;i<5;i++)
{
vr.push_back(*pr);
pr++;
out<<"push第"<<i+1<<"个Rock\n";
}
out.close();
system("pause");
}

下面为输出内容
Rock()
Rock()
Rock()
Rock()
Rock()
Rock(const Rock&)
push第1个Rock
Rock(const Rock&)
~Rock()
Rock(const Rock&)
push第2个Rock
Rock(const Rock&)
Rock(const Rock&)
~Rock()
~Rock()
Rock(const Rock&)
push第3个Rock
Rock(const Rock&)
Rock(const Rock&)
Rock(const Rock&)
~Rock()
~Rock()
~Rock()
Rock(const Rock&)
push第4个Rock
Rock(const Rock&)
Rock(const Rock&)
Rock(const Rock&)
Rock(const Rock&)
~Rock()
~Rock()
~Rock()
~Rock()
Rock(const Rock&)
push第5个Rock

照结果看,每次push_back一个元素之前vector都将根据原来的元素构造新的元素,并析构原来的元素,
是不是应该这样理解?为什么要这样,不是很费事吗?
...全文
66 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
redshiliu 2011-05-04
  • 打赏
  • 举报
回复
收到,结贴。
ljt3969636 2011-05-04
  • 打赏
  • 举报
回复
这里有个概念问题,构造析构那么多次是因为什么?不是临时变量什么的问题,是vector预分配空间不够,造成重新申请空间,将原空间元素复制过去造成的。你看看下面的代码

vector<Rock> vr;
vr.reserve(100);//来个大空间
Rock* pr=new Rock[5];
for (int i=0;i<5;i++)
{
vr.push_back(*pr);
pr++;
out<<"push第"<<i+1<<"个Rock\n";
}
out.close();
redshiliu 2011-05-04
  • 打赏
  • 举报
回复
那么到底是那些变量被析构了呢?我新手讲个明白嘛。
pengzhixi 2011-05-04
  • 打赏
  • 举报
回复
每次push_back一个元素之前vector都将根据原来的元素构造新的元素,并析构原来的元素

前面一句没错,但是析构原来的元素这句就不正确了。
老邓 2011-05-04
  • 打赏
  • 举报
回复
临时变量,没办法的。
C++0x的右值引用专门用来解决这个临时对象的效率问题。

64,678

社区成员

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

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