std的vector 作为参数传入或者作为返回值

【01】[参数]
      std::vector 作为参数传入,是值传递,vector本身,及vector内的所有元素都会复制一遍。

得不偿失,可以使用引用传递。即建议写成 rType func(pType p1,vector<int>& p2,...)

【02】【返回值】

    std::vector作为函数返回值,是不会创建新vector对象的。函数内返回的跟接收返回值的是一个对象。

读取vector内的元素,如果赋值给其他变量,是将对象复制一份新的。如果写成:

   vector<int> fn()

{

vector<int> rVal;//(1)

//TODO

return rVal;

}
以上描述中可以明白,不建议用vector作为返回值 ,如果 rVal是类的成员变量(类中的成员一般写成,m_rVal,这里只为了举例),同时,此时你要注意此类定义的对象的生命周期,这个需要你对类成员与Vector有深入理解,一般没必要这样,以故作高深,作用意义不大,重点是后面这句,如果 你使用时也如上面的//(1)定义了一个临时变量vector,并返回此临时变量,那么将可能产生严重的错误,因为返回的是一个栈中的临时变量(vector的返回值不发生复制,传回的是临时vector本身),当你调用完fn时,vector已经被释放了,如果你调用完fn后,马上使用返回vector 变量,可能会输出 正确的值,那是因为栈虽然释放了,但是以临时变量与栈的地址的映射关系还没有完全被破坏,就像你delete prt;然后你在访问prt还是可以得到以前的数据的(这句delete后又访问,不是很严谨,有些IDE delete后是不能访问了的,有些可以,这里只为了表达这个意思),如果你调用完fn函数后,又调用另一个带参数的函数fn2,那么栈先被fn使用用,然后又被fn2使用,栈的映射关系已经被破坏了,那么你在对刚才返回的vector操作,会出现错识别或者打印出乱码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值