【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操作,会出现错识别或者打印出乱码。