Re: [問題] 在STL容器中增加元素的方法

看板C_and_CPP (C/C++)作者 (眠月)時間16年前 (2009/09/10 02:03), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《holymars ()》之銘言: : 有個STL容器 : std::list<T> my_list; : 要在容器最後面新增一個元素的時侯,下面兩種方法哪一種比較有效率呢.. : 1. : T temp; : // 對temp的內容操作.. : my_list.push_back(temp); : 2. : my_list.resize(my_list.size() + 1); : T& temp = my_list.back(); : // 對temp的內容操作.. : 之前一直習慣的寫法都是1. : 但是2.的作法好像少呼叫一次copy constructor : 有人對這兩種作法的效率問題作過實際的測試嗎 @ @? 直覺 2 完全佔不到便宜, 因為 resize 的瞬間你就要呼叫一個預設建構子, 不過還是看一下 VC++ 2008 Express 附的實作版本好了…… void resize(size_type _Newsize) { // determine new length, padding with _Ty() elements as needed resize(_Newsize, _Ty()); } void resize(size_type _Newsize, _Ty _Val) { // determine new length, padding with _Val elements as needed if (size() < _Newsize) _Insert_n(end(), _Newsize - size(), _Val); else if (_Newsize < size()) erase(begin() + _Newsize, end()); } 首先,resize 會呼叫一次預設建構子, 然後,會一兩次條件判斷,第二次不可能發生,所以忽略。 接著會進行一次 insert_n,這裡頭有個迴圈,貴鬆鬆, 雖然我們知道只會插一個,但是迴圈還是得跑,有迴圈就要破壞 pipeline 了, 看了原始碼就知道所謂的 resize 最後該花的錢(建構子)還是得花, 考慮最佳化以後也許一些多餘的複製成本省掉可以打平, 但是那個條件判斷跟那個迴圈你還是要開銷…… 結果蠻明顯的……真的要花時間測嗎 XD??? -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.110.8

09/10 10:39, , 1F
剛剛翻了一下實作push_back也是呼叫_Insert_n XDD
09/10 10:39, 1F

09/10 10:40, , 2F
只是它第二個值參數傳(size_type)1 進去
09/10 10:40, 2F
文章代碼(AID): #1Af-tbfU (C_and_CPP)
文章代碼(AID): #1Af-tbfU (C_and_CPP)