看板 C_and_CPP 關於我們 聯絡資訊
一些特殊原因,要拆解一點 bitset 出來, 為方便討論,討論前提基於 bitset 只有一個函式成員, unsigned m32; 並假設 sizeof(unsigned) = 32 bits。 ---------- 一般 operatr[] 大多是用在成員有 array 上面, 這些都算好寫,但 bitset 較特別, 它是用在第幾個 bit 上面。 上 c++ reference 看,operator[] 原型有兩種 bool operator[] ( size_t pos ) const; reference operator[] ( size_t pos ); 第一種還可以推斷得出來, 是要提取出 pos-th bit 之真偽,可能長這樣 bool operator[] (size_t pos) const { return (m32 & (1U<<pos)) != 0U; } 第二種 return type 是 reference ,後來再查發現, 應該是 bitset 繼承的 class , 請問這個 reference class 大體長怎樣? 又第二種 reference operator[] (size_t pos) 該如何實現較佳? 最後再問二個問題 Q2 : bool 是否可將 true 視為 1 ; false 視為 0 , 拿來參與四則運算? Q3 : vector<bool> 有經過特偏化 (是特偏化吧?) 壓縮空間, bitset< n > 要 runtime 確定長度 , 那我需要一個 runtime size 的 bitset , 過程中會用到 (1) clear, resize. (2) operator[pos] (3) to_ulong() ,這個可能要自己寫 可以偷用 vector<bool> 嗎 (雖然覺得好像也沒比較好 Orz )? 謝謝各位不吝解惑,感激不盡。 -- 「自從我學了 C# , 人都變聰明 , 考試都考一百分」 「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」 「自從我學了 Java , 明顯變壯 , 個子也變高了 」 「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.161
diabloevagto:Q2目前gcc是可以當作0跟1,不過這是因為gcc是這樣處 06/25 20:38
diabloevagto:理,建議還是自己用個(bool == true):1?0; 06/25 20:38
diabloevagto:加在運算式內這樣比較保險 06/25 20:39
EdisonX:樓上d大點到我想問的了,依std它是ok的嗎? C寫久了突然多了 06/25 20:39
EdisonX:bool 反而好不習慣 Orz 06/25 20:39
diabloevagto:你Q3是否自己寫個struct會比較好呢? 06/25 20:40
EdisonX:Q3 實際上與 Q1 相關,就是卡在 overload operator[]. 06/25 20:42
diabloevagto:http://ideone.com/hkaGn 是ok,不過我想還是不要冒 06/25 20:44
diabloevagto:險的好 06/25 20:44
diabloevagto:你Q3都用vector的話,何必在自己寫個op[]? 06/25 20:45
抱歉,我該講清楚。 忘了在哪本 Effective 裡面的 Item 提到, vector<bool> 實際上不是一個 container, 原本一個 element 應該要存 1 bytes, 但 vector<bool> 只用 1bit, 所以該 Item 提出 「never use vector<bool>」之類的敘述。 而 Q3 重點是在於,若只有那三項操作時,使用 vector<bool> 會不會出包, 如果會出包、不適用 vector<bool>,那就是該解決 bitset operator[] 問題。 ※ 編輯: EdisonX 來自: 180.177.76.161 (06/25 20:51)
hilorrk:http://bit.ly/MPRT2j 06/25 20:51
hilorrk:#1E-pLLUo 06/25 20:53
EdisonX:謝謝 h 大,Q3 看來確定被打槍,source 我研究想一下,感謝:) 06/25 20:56
Chikei:Q2: Yes, standard draft N3093 4.5/6 4.7/4 06/25 21:27
diabloevagto:那我之前聽得true不一定是1是錯的摟... 06/25 21:31
Chikei:人家搞不好指的是VC6或gcc 3.x的C++ :p 06/25 21:38
Chikei:Q1何不參考boost::dynamic_bitset ? 06/25 21:39
diabloevagto:另外請問,那個標準的檔案要到那邊看? 06/25 21:41
Chikei:http://www.open-std.org/jtc1/sc22/wg21/ n3242 06/25 21:53
diabloevagto:感謝你!值得研究研究 06/25 21:53
EdisonX:原來是 proxy, DP 看完一遍遇到問題還是轉不過來說 orz 06/25 22:17
EdisonX:謝謝 C 大回覆 :) 06/25 22:18
loveme00835:4.5/1 看一下, 什麼是 prvalue... 簡單來說要轉自己加 06/26 00:35
loveme00835:括號, 有號搭無號作運算, 如果你再加上位移運算後果是 06/26 00:36
loveme00835:很恐怖的... 06/26 00:36
loveme00835:proxy很常用到, 在STL容器中對一個迭代器要求的操作 06/26 00:38
loveme00835:像 Input Iterator 的 operator* 回傳型態必須是 06/26 00:39
loveme00835:"convertible to T" 換句話說為了更大的彈性, 實際上 06/26 00:40
loveme00835:不會直接回傳 T&, 甚至一種容器光迭代器內部就轉來轉 06/26 00:41
loveme00835:去好幾種 06/26 00:41
Chikei:不是rvalue refer相關產物的rvalue 06/26 01:17
EdisonX:冒味請教,那些編號該怎麼查 ? 上 C 大連結 Ctrl+F 找不到. 06/26 02:40
diabloevagto:ISO/IEC 14882:2011 Programming Language C++-draft 06/26 02:47
diabloevagto:點draft會連到一個n3242.pdf 06/26 02:47
diabloevagto:這個就是了 06/26 02:48
EdisonX:謝謝 d 大 , 也謝謝 loveme~ 大 :) 06/26 02:50