標籤:

《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也是同樣的。

  1. 為什麼沒對map使用呢?就是因為對它的value使用後,耗內存的大戶已經解決了。
  2. 假如只對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 |