std的vector 作為引數傳入或者作為返回值

2021-10-04 23:55:53 字數 871 閱讀 7016

[引數]

std::vector 作為引數傳入,是值傳遞,vector本身,及vector內的所有元素都會複製一遍。

得不償失,可以使用引用傳遞。即建議寫成 rtype func(ptype p1,vector& p2,...)

【返回值】

std::vector作為函式返回值,是不會建立新vector物件的。函式內返回的跟接收返回值的是乙個物件。

讀取vector內的元素,如果賦值給其他變數,是將物件複製乙份新的。如果寫成:

vectorfn()

vectorrval;//(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操作,會出現錯識別或者列印出亂碼。

vector作為引數傳遞到dll問題

最近的乙個專案中遇到了呼叫別人的sdk介面 dll庫 而傳給我的是乙個vector指標,用完之後還要我來刪除的情況。這個過程中首先就是在我的exe中將其vector指標轉為相應指標再獲取vector中相應的資料問題,始終都獲得不了正確的資料,要麼就是一些非法的資料 另乙個問題就是delete這個指標...

指標作為函式引數傳參的問題

在大一的時候就遇到的乙個當時一直懂得不太透徹的問題 使用函式來交換兩個變數的值.現在常常用到algorithm標頭檔案裡的swap函式,因此決定整理一下這個問題.希望能對後來者有所幫助.首先,要知道的乙個結論是函式引數的傳遞是單向的,也就是實參 形參,無法完成形參 實參的引數傳遞.因此,像下面這種寫...

std中list作為常量傳參時乙個迭代器錯誤

如果list作為常量引數傳入函式時,使用list的迭代器要注意,如果 這樣寫 ostream operator ostream ostr,const list li return ostr error conversion from std list const iterator to non sc...