Boolan C 第六周學習筆記

2021-07-27 15:20:16 字數 1157 閱讀 4016

談談stl容器vector

vector作為一種連續性容器,是指它在記憶體的表現上,邏輯上相鄰的資料,在記憶體中也是連續的。這就保證它在訪問每個元素的操作時可以在固定的指令上通過偏移的方式去訪問,相比一般的陣列,它還有乙個明顯的特點就是大小可變。

vector的空間是動態分配的,由於大小可變,一旦遇到要擴容的情況,有必要重新申請一塊合適的空間,並把原本位址的資料重新移到新的地方,這個操作就會有明顯的開銷。因此這種操作不會發生的太頻繁,一般的策略是每當空間不夠時,重新分配一塊原大小2倍的空間。在使用vector時可以看到有size和capacity這兩個量,size表示已有的元素數量,capacity表示目前已分配的空間大小,capacity>=size。因此相比普通陣列,vector在記憶體管理上會有開銷。

相比其他的容器(deque,list),vector可以有o(1)的查詢效率,和很好的push_back的效率,但是在中間插入或刪除資料就會比較慢。

關於偏特化vector

乙個比較特殊的容器,按照cpulsplus reference的說法。可能真的是按位儲存的,它的元素也不是靠分配器構造,其中還有乙個特殊的成員:reference,用於訪問每乙個「位」。但是實際我們用bool的時候應該會注意到,bool並不是按位儲存在記憶體中的,為什麼說明上說:vector是將每個元素儲存在內容的「位」裡的呢?

實際上對於以下**:

vectorv;

v[0] = true;

bool &s = v[0];

編譯是不通過的,因為實際上v[0]得到的並不是乙個bool變數,按照錯誤資訊的說法:

initial value of reference to non-const must be an lvalue

貌似都不是乙個左值,真是奇特,很好奇什麼情況會用vector,對空間要求非常苛刻的情況下?

關於map和set的實現策略問題

之前一直很奇怪,map這種鍵值對應的查詢不應該是用hash來實現嗎?後來才知道是unordered_map,而我一直所知道的map是基於紅黑樹實現的。

那麼紅黑樹叢實現目的上說,應該是為了維持書的平衡,便於二分查詢,那麼為什麼不使用本科學的,所謂的平衡二叉樹?

後來問了別人,因為高度平衡的平衡二叉樹,每次一加入和刪除資料都需要對樹的結構進行修改,開銷就會比較大,而黑紅樹的採取相當於一種折中的方案。

第六周學習筆記

課程位址 第十七講,離散與維數災難 主要內容 值得注意的地方 1.未知的psa p ps a 和r rr 即便我們能夠通過值迭代或策略迭代來解決mdp問題,但對於一些實際問題,我們不知道p pp和r rr的具體值,這時我們可以通過取樣,在尋找策略的過程中同時模擬出真實的模型 第十八講,線性二次型調節...

第六周 學習筆記

一 位運算 位運算子 1 位邏輯符 2 移位運算子 2.位邏輯運算 二進位制位的運算,按位運算 位與運算 全1為 1位異或運算 不相等為 1,相等為 0位或運算 有1為 1位取反運算 位邏輯運算與邏輯運算的區別 邏輯運算的結果只有0和 13.移位運算 1 2 左移兩位 1 2 右移兩位 考慮正負號 ...

C 第六周學習筆記

1.實參的資料型別必須與 形參的相同 形參和實參的區別 形參出現在函式定義中,在整個函式體內都可以使用,離開該函式則不能使用。實參出現在主調函式中,進入被調函式後,實參變數也不能使用。形參和實參的功能是作資料傳送。發生函式呼叫時,主調函式把實參的值傳送給被調函式的形參從而實現主調函式向被調函式的資料...