[問題] smart pointer 新手的小小問題

看板C_and_CPP作者 (MashiroKinji)時間9年前 (2015/02/28 05:23), 編輯推噓3(3014)
留言17則, 9人參與, 最新討論串1/2 (看更多)
既上次向各位前輩討教關於的問題 https://www.ptt.cc/bbs/C_and_CPP/M.1424809447.A.FBD.html 小弟開始決定使用智能指標 想請問一下使用智能指標跑for的時候 std::vector<std::unique_ptr<MyClass>> vector; for (int i = 0; i < 10;i++) { std::unique_ptr<MyClass> temp(new MyClass(i)); vector.push_back(std::move(temp)); } //----- (1) for (std::vector<std::unique_ptr<MyClass>>::iterator i = vector.begin(); i != vector.end(); i++) { i->get()->Print(); } (2) for (int i = 0; i < vector.size(); i++) { vector[i]->Print(); } //----- vector.clear(); 想請問一下(1),(2)哪個做法會比較好呢? 感覺(1)的方法超長的看得好辛苦... (2)的話又感覺不是很專業!? 另外同樣的功能用傳統的指標去做整體程式碼就看起來很簡潔 而且在push_back的時候還可以 vector.push_back(new MyClass(i)); 比起要創建一個unique_ptr然後再用move傳送 感覺還要快好多 是不是在使用智能指標後就要有著和使用Java的垃圾回收機制 一定要有著效能降低的準備?? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 121.254.69.174 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1425072234.A.422.html

02/28 05:45, , 1F
都用 C++11 了就用 range-based for 吧
02/28 05:45, 1F

02/28 05:54, , 2F
能的話就用for_each,不行才考慮for loop
02/28 05:54, 2F

02/28 06:14, , 3F
怎麼覺得我學得越來越不像C++了= =
02/28 06:14, 3F

02/28 06:15, , 4F
課本的for(;;),陣列,指標都不用了...
02/28 06:15, 4F

02/28 06:32, , 5F
是說for(;;)和for(:) for(:)有比較快嗎?
02/28 06:32, 5F

02/28 09:30, , 6F
auto i = vector.begin();
02/28 09:30, 6F

02/28 11:14, , 7F
(1)和(2)應該是一樣的
02/28 11:14, 7F

02/28 11:14, , 8F
再來可以用 emplace_back 來代替 move + push_back
02/28 11:14, 8F

02/28 11:16, , 9F
最後智能指標只是避免你忘記手動 delete 的包裝
02/28 11:16, 9F

02/28 11:23, , 10F
並沒有像 java gc 那麼強大...所以也沒有多少 overhead
02/28 11:23, 10F

02/28 12:48, , 11F
真的, 請愛用 auto 和 for_each
02/28 12:48, 11F

02/28 12:49, , 12F
for(:) 也是個方法
02/28 12:49, 12F

02/28 15:32, , 13F
我看書上說for(:)編譯過後其實是用iterator的普通for loop
02/28 15:32, 13F

02/28 23:17, , 14F
程式是寫給"人"看的,編譯器才不管啥奇淫技巧
02/28 23:17, 14F

02/28 23:17, , 15F
for(;;)變成組語後大多一樣啦
02/28 23:17, 15F

02/28 23:24, , 16F
記得還有不推薦把 new 跟智能指標建構分開
02/28 23:24, 16F

02/28 23:25, , 17F
make_[unique|shared] 除了記憶體連續 也處理例外比較好
02/28 23:25, 17F
文章代碼(AID): #1KyE1gGY (C_and_CPP)
文章代碼(AID): #1KyE1gGY (C_and_CPP)