c++的stl的vector的push_back()的问题

zhujl1991 2013-07-31 11:57:09

struct SCCnum
{
int leader;
int num;
SCCnum(int i, int j) : leader(i), num(j){};
};
vector<SCCnum> sn;

问题一:我如果相对sn进行push_back()操作,以下两种哪种正确(我查了下资料,貌似应该是第二种正确,但是第一种我的gcc也能编译过这是为啥?)?
1: sn.push_back(new SCCnum(1,2));
2: sn.push_back(SCCnum(1,2));

问题二:如果第一种正确,这种情况下,是不是当我访问sn[0]的时候,实际是访问的new出来的那部分内存空间?

多谢大家了!
...全文
511 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujl1991 2013-08-03
  • 打赏
  • 举报
回复
引用 12 楼 qzf362269994 的回复:
[quote=引用 11 楼 zhujl1991 的回复:] [quote=引用 10 楼 qzf362269994 的回复:] [quote=引用 8 楼 zhujl1991 的回复:] [quote=引用 3 楼 qzf362269994 的回复:] 第二种对的吧 sn.push_back(new Object())是可以的,因为这样生成了一个新的类实例,并返回了这个实例的内存地址,所以是可以插入到vector容器中的。但vector存的是SCCnum对象
那请问第二种具体在内存中是怎样进行的呢? 比如说,如果是

SCCnum temp(1,2);
sn.push_back(temp);
我可以理解为先调用构造函数来在内存中创建temp这个对象,然后再把temp变量里的内容复制到sn这个vector中去。 那请问这第二种方式在内存中是怎么进行的呢?是不是先在内存中创建了一个临时的SCCnum这个类的对象(跟temp一样,只不过是临时的),然后把这里面内容复制到sn里呢?那SCCnum(1,2)作为sn.push_back()的参数,实际上是将什么传进了sn.push_back()呢(也就是SCCnum(1,2)的返回值是啥啊?)? 我刚开始学编程,多谢大家的热心回答![/quote] 返回的是一个SCCnum的匿名对象其leader=1, num=2和 SCCnum temp(1,2); sn.push_back(temp);效果一样[/quote] 所谓匿名对象是不是就是在内存里临时开出来一块地方,在进行完这次push_back()操作之后,很快就会被os收回?[/quote] 匿名对象只存在构造该对象的那行代码,离开构造匿名对象那行代码后立即调用析构函数。[/quote] 好的!这下完全懂了!非常感谢!
qzf362269994 2013-08-03
  • 打赏
  • 举报
回复
引用 11 楼 zhujl1991 的回复:
[quote=引用 10 楼 qzf362269994 的回复:] [quote=引用 8 楼 zhujl1991 的回复:] [quote=引用 3 楼 qzf362269994 的回复:] 第二种对的吧 sn.push_back(new Object())是可以的,因为这样生成了一个新的类实例,并返回了这个实例的内存地址,所以是可以插入到vector容器中的。但vector存的是SCCnum对象
那请问第二种具体在内存中是怎样进行的呢? 比如说,如果是

SCCnum temp(1,2);
sn.push_back(temp);
我可以理解为先调用构造函数来在内存中创建temp这个对象,然后再把temp变量里的内容复制到sn这个vector中去。 那请问这第二种方式在内存中是怎么进行的呢?是不是先在内存中创建了一个临时的SCCnum这个类的对象(跟temp一样,只不过是临时的),然后把这里面内容复制到sn里呢?那SCCnum(1,2)作为sn.push_back()的参数,实际上是将什么传进了sn.push_back()呢(也就是SCCnum(1,2)的返回值是啥啊?)? 我刚开始学编程,多谢大家的热心回答![/quote] 返回的是一个SCCnum的匿名对象其leader=1, num=2和 SCCnum temp(1,2); sn.push_back(temp);效果一样[/quote] 所谓匿名对象是不是就是在内存里临时开出来一块地方,在进行完这次push_back()操作之后,很快就会被os收回?[/quote] 匿名对象只存在构造该对象的那行代码,离开构造匿名对象那行代码后立即调用析构函数。
zhujl1991 2013-08-03
  • 打赏
  • 举报
回复
引用 10 楼 qzf362269994 的回复:
[quote=引用 8 楼 zhujl1991 的回复:] [quote=引用 3 楼 qzf362269994 的回复:] 第二种对的吧 sn.push_back(new Object())是可以的,因为这样生成了一个新的类实例,并返回了这个实例的内存地址,所以是可以插入到vector容器中的。但vector存的是SCCnum对象
那请问第二种具体在内存中是怎样进行的呢? 比如说,如果是

SCCnum temp(1,2);
sn.push_back(temp);
我可以理解为先调用构造函数来在内存中创建temp这个对象,然后再把temp变量里的内容复制到sn这个vector中去。 那请问这第二种方式在内存中是怎么进行的呢?是不是先在内存中创建了一个临时的SCCnum这个类的对象(跟temp一样,只不过是临时的),然后把这里面内容复制到sn里呢?那SCCnum(1,2)作为sn.push_back()的参数,实际上是将什么传进了sn.push_back()呢(也就是SCCnum(1,2)的返回值是啥啊?)? 我刚开始学编程,多谢大家的热心回答![/quote] 返回的是一个SCCnum的匿名对象其leader=1, num=2和 SCCnum temp(1,2); sn.push_back(temp);效果一样[/quote] 所谓匿名对象是不是就是在内存里临时开出来一块地方,在进行完这次push_back()操作之后,很快就会被os收回?
qzf362269994 2013-08-03
  • 打赏
  • 举报
回复
引用 8 楼 zhujl1991 的回复:
[quote=引用 3 楼 qzf362269994 的回复:] 第二种对的吧 sn.push_back(new Object())是可以的,因为这样生成了一个新的类实例,并返回了这个实例的内存地址,所以是可以插入到vector容器中的。但vector存的是SCCnum对象
那请问第二种具体在内存中是怎样进行的呢? 比如说,如果是

SCCnum temp(1,2);
sn.push_back(temp);
我可以理解为先调用构造函数来在内存中创建temp这个对象,然后再把temp变量里的内容复制到sn这个vector中去。 那请问这第二种方式在内存中是怎么进行的呢?是不是先在内存中创建了一个临时的SCCnum这个类的对象(跟temp一样,只不过是临时的),然后把这里面内容复制到sn里呢?那SCCnum(1,2)作为sn.push_back()的参数,实际上是将什么传进了sn.push_back()呢(也就是SCCnum(1,2)的返回值是啥啊?)? 我刚开始学编程,多谢大家的热心回答![/quote] 返回的是一个SCCnum的匿名对象其leader=1, num=2和 SCCnum temp(1,2); sn.push_back(temp);效果一样
max_min_ 2013-08-03
  • 打赏
  • 举报
回复
引用 7 楼 zhujl1991 的回复:
[quote=引用 2 楼 max_min_ 的回复:]

第二种是对的吧! vector其实类似于数组的。
vector的存储地址是连续的,在定义一个<int>类型vector后,
长度和容量都是0,但是插入第一个元素后,ivec的容量是256,长度是1,
当插到第256个时,重新拷贝,分配2倍的空间

对于你说的第一种自己也可以new空间的话,你可以打印看看,
你先用第一种方法new一次的,然后在用第二种方法push一个数据!
把两个数据的地址看看,是不是连续的?看你的new的是不是对vector的操作
那请问第二种具体在内存中是怎样进行的呢? 比如说,如果是

SCCnum temp(1,2);
sn.push_back(temp);
我可以理解为先调用构造函数来在内存中创建temp这个对象,然后再把temp变量里的内容复制到sn这个vector中去。 那请问这第二种方式在内存中是怎么进行的呢?是不是先在内存中创建了一个临时的SCCnum这个类的对象(跟temp一样,只不过是临时的),然后把这里面内容复制到sn里呢?那SCCnum(1,2)作为sn.push_back()的参数,实际上是将什么传进了sn.push_back()呢(也就是SCCnum(1,2)的返回值是啥啊?)? 我刚开始学编程,多谢大家的热心回答![/quote]


vector负责开辟内存空间,然后将temp变量里的
内容复制(实际上调用拷贝构造函数,复制一份temp的内容)到sn这个vector中去
至于vector内部如何来实现开辟内存空间的,得查查资料看源码了,我也没深入了解


zhujl1991 2013-08-03
  • 打赏
  • 举报
回复
引用 3 楼 qzf362269994 的回复:
第二种对的吧 sn.push_back(new Object())是可以的,因为这样生成了一个新的类实例,并返回了这个实例的内存地址,所以是可以插入到vector容器中的。但vector存的是SCCnum对象
那请问第二种具体在内存中是怎样进行的呢? 比如说,如果是

SCCnum temp(1,2);
sn.push_back(temp);
我可以理解为先调用构造函数来在内存中创建temp这个对象,然后再把temp变量里的内容复制到sn这个vector中去。 那请问这第二种方式在内存中是怎么进行的呢?是不是先在内存中创建了一个临时的SCCnum这个类的对象(跟temp一样,只不过是临时的),然后把这里面内容复制到sn里呢?那SCCnum(1,2)作为sn.push_back()的参数,实际上是将什么传进了sn.push_back()呢(也就是SCCnum(1,2)的返回值是啥啊?)? 我刚开始学编程,多谢大家的热心回答!
zhujl1991 2013-08-03
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:

第二种是对的吧! vector其实类似于数组的。
vector的存储地址是连续的,在定义一个<int>类型vector后,
长度和容量都是0,但是插入第一个元素后,ivec的容量是256,长度是1,
当插到第256个时,重新拷贝,分配2倍的空间

对于你说的第一种自己也可以new空间的话,你可以打印看看,
你先用第一种方法new一次的,然后在用第二种方法push一个数据!
把两个数据的地址看看,是不是连续的?看你的new的是不是对vector的操作
那请问第二种具体在内存中是怎样进行的呢? 比如说,如果是

SCCnum temp(1,2);
sn.push_back(temp);
我可以理解为先调用构造函数来在内存中创建temp这个对象,然后再把temp变量里的内容复制到sn这个vector中去。 那请问这第二种方式在内存中是怎么进行的呢?是不是先在内存中创建了一个临时的SCCnum这个类的对象(跟temp一样,只不过是临时的),然后把这里面内容复制到sn里呢?那SCCnum(1,2)作为sn.push_back()的参数,实际上是将什么传进了sn.push_back()呢(也就是SCCnum(1,2)的返回值是啥啊?)? 我刚开始学编程,多谢大家的热心回答!
zhujl1991 2013-08-03
  • 打赏
  • 举报
回复
引用 1 楼 hai200501019 的回复:
vector存的是SCCnum对象,自然是第二种正确咯
那请问第二种具体在内存中是怎样进行的呢? 比如说,如果是

SCCnum temp(1,2);
sn.push_back(temp);
我可以理解为先调用构造函数来在内存中创建temp这个对象,然后再把temp变量里的内容复制到sn这个vector中去。 那请问这第二种方式在内存中是怎么进行的呢?是不是先在内存中创建了一个临时的SCCnum这个类的对象(跟temp一样,只不过是临时的),然后把这里面内容复制到sn里呢?那SCCnum(1,2)作为sn.push_back()的参数,实际上是将什么传进了sn.push_back()呢(也就是SCCnum(1,2)的返回值是啥啊?)? 我刚开始学编程,多谢大家的热心回答!
max_min_ 2013-08-01
  • 打赏
  • 举报
回复

第二种是对的吧! vector其实类似于数组的。
vector的存储地址是连续的,在定义一个<int>类型vector后,
长度和容量都是0,但是插入第一个元素后,ivec的容量是256,长度是1,
当插到第256个时,重新拷贝,分配2倍的空间

对于你说的第一种自己也可以new空间的话,你可以打印看看,
你先用第一种方法new一次的,然后在用第二种方法push一个数据!
把两个数据的地址看看,是不是连续的?看你的new的是不是对vector的操作
海的神话 2013-08-01
  • 打赏
  • 举报
回复
vector存的是SCCnum对象,自然是第二种正确咯
net_assassin 2013-08-01
  • 打赏
  • 举报
回复
我在vs上编译通不过, 第一种,存储的是指向对象的指针 第二种,存储的是对象的副本
nextseconds 2013-08-01
  • 打赏
  • 举报
回复
两种方法编译都可以的,只不过第一种存的是地址,第二种存的是对象,正确的使用应该使用第二种方法
qzf362269994 2013-08-01
  • 打赏
  • 举报
回复
第二种对的吧 sn.push_back(new Object())是可以的,因为这样生成了一个新的类实例,并返回了这个实例的内存地址,所以是可以插入到vector容器中的。但vector存的是SCCnum对象

64,688

社区成员

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

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