《C++ Primer》讀書筆記-第十二章 03 使用標準庫 part2
聲明:
- 文中內容收集整理自《C++ Primer 中文版 (第5版)》,版權歸原書所有。
- 原書有更加詳細、精彩的釋義,請大家購買正版書籍進行學習。
- 本文僅作學習交流使用,禁止任何形式的轉載
正文
我們可以對TextQuery的定義做一下更改
class QueryResult; nclass TextQuery n{ npublic: n using line_no = std::vector<std::string>::size_type; n TextQuery(std::ifstream&); n QueryResult Query(const std::string&) const; nprivate: n std::vector<std::string> m_spFile; n std::map<std::string, std::set<line_no>> m_vm; n};n
我們將兩個數據成員的shared_ptr都去掉,並對程序的其他部分做出相應的變更,發現程序仍能正常運行。
那麼這裡使用shared_ptr的目的是什麼?或者說優勢在哪裡?
vector<string> v1{"a", "b", "c"}; nvector<string> v2 = v1; nnshared_ptr<vector<string>> spV1 = make_shared({"a", "b", "c"}); nshared_ptr<vector<string>> spV2 = spV1;n
可以很容易看出來,直接使用vector屬於值傳遞,內存中實際上有兩份{"a", "b", "c"}。而使用shared_ptr則只有一份。像本例中把整個文本保存到vector的做法,顯然使用shared_ptr能夠節省大量內存。
對set也是同樣的。
- 為什麼沒對map使用呢?就是因為對它的value使用後,耗內存的大戶已經解決了。
- 假如只對map使用而不對set使用呢?這是不行的,後面要取出set進行傳遞,如果只對map使用shared_ptr,在傳遞set時還會是值傳遞。
接下來再看看為什麼nodata使用局部靜態變數
當然,這裡使用普通的局部變數局部變數程序也是可以執行的。
如果我們使用普通局部變數,那麼每次執行Query函數時,都要創建一份nodata,並在函數執行完畢時銷毀。如果在一個程序中大量使用Query函數,就會造成頻繁的內存申請和釋放操作。所以這裡使用局部靜態變數有其可取之處。
那麼能不能不使用動態內存,而使用普通的set呢?
set<line_no> nodata;n
我覺得是可以的。儘管我們需要把nodata傳遞給QueryResult,但是我想值傳遞一個空的set並不會有太大的消耗。
大家有沒有其它的想法呢?
END
微信公眾號, 馬志峰的編程筆記
專註做好一件事,每天早起學習編程1.5小時並輸出筆記。
與其去羨慕高手裝逼,不如來見證菜鳥成長!
推薦閱讀:
※《C++ Primer》讀書筆記-第七章 04 類的作用域
※我的CUDA學習之旅2——圖像形態學腐蝕、膨脹CUDA實現
※【源碼眾讀】之問題解答,cpp_Part_3
※C++實現神經網路之四—神經網路的預測和輸入輸出的解析
※《C++ Primer》讀書筆記-第十一章 03 關聯容器操作
TAG:C |
