[問題] bitset subscript operator

看板C_and_CPP作者 (閉上眼的魚)時間13年前 (2012/06/25 20:35), 編輯推噓0(0036)
留言36則, 5人參與, 最新討論串1/1
一些特殊原因,要拆解一點 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

06/25 20:38, , 1F
Q2目前gcc是可以當作0跟1,不過這是因為gcc是這樣處
06/25 20:38, 1F

06/25 20:38, , 2F
理,建議還是自己用個(bool == true):1?0;
06/25 20:38, 2F

06/25 20:39, , 3F
加在運算式內這樣比較保險
06/25 20:39, 3F

06/25 20:39, , 4F
樓上d大點到我想問的了,依std它是ok的嗎? C寫久了突然多了
06/25 20:39, 4F

06/25 20:39, , 5F
bool 反而好不習慣 Orz
06/25 20:39, 5F

06/25 20:40, , 6F
你Q3是否自己寫個struct會比較好呢?
06/25 20:40, 6F

06/25 20:42, , 7F
Q3 實際上與 Q1 相關,就是卡在 overload operator[].
06/25 20:42, 7F

06/25 20:44, , 8F
http://ideone.com/hkaGn 是ok,不過我想還是不要冒
06/25 20:44, 8F

06/25 20:44, , 9F
險的好
06/25 20:44, 9F

06/25 20:45, , 10F
你Q3都用vector的話,何必在自己寫個op[]?
06/25 20:45, 10F
抱歉,我該講清楚。 忘了在哪本 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)

06/25 20:51, , 11F
06/25 20:51, 11F

06/25 20:53, , 12F
06/25 20:53, 12F

06/25 20:56, , 13F
謝謝 h 大,Q3 看來確定被打槍,source 我研究想一下,感謝:)
06/25 20:56, 13F

06/25 21:27, , 14F
Q2: Yes, standard draft N3093 4.5/6 4.7/4
06/25 21:27, 14F

06/25 21:31, , 15F
那我之前聽得true不一定是1是錯的摟...
06/25 21:31, 15F

06/25 21:38, , 16F
人家搞不好指的是VC6或gcc 3.x的C++ :p
06/25 21:38, 16F

06/25 21:39, , 17F
Q1何不參考boost::dynamic_bitset ?
06/25 21:39, 17F

06/25 21:41, , 18F
另外請問,那個標準的檔案要到那邊看?
06/25 21:41, 18F

06/25 21:53, , 19F

06/25 21:53, , 20F
感謝你!值得研究研究
06/25 21:53, 20F

06/25 22:17, , 21F
原來是 proxy, DP 看完一遍遇到問題還是轉不過來說 orz
06/25 22:17, 21F

06/25 22:18, , 22F
謝謝 C 大回覆 :)
06/25 22:18, 22F

06/26 00:35, , 23F
4.5/1 看一下, 什麼是 prvalue... 簡單來說要轉自己加
06/26 00:35, 23F

06/26 00:36, , 24F
括號, 有號搭無號作運算, 如果你再加上位移運算後果是
06/26 00:36, 24F

06/26 00:36, , 25F
很恐怖的...
06/26 00:36, 25F

06/26 00:38, , 26F
proxy很常用到, 在STL容器中對一個迭代器要求的操作
06/26 00:38, 26F

06/26 00:39, , 27F
像 Input Iterator 的 operator* 回傳型態必須是
06/26 00:39, 27F

06/26 00:40, , 28F
"convertible to T" 換句話說為了更大的彈性, 實際上
06/26 00:40, 28F

06/26 00:41, , 29F
不會直接回傳 T&, 甚至一種容器光迭代器內部就轉來轉
06/26 00:41, 29F

06/26 00:41, , 30F
去好幾種
06/26 00:41, 30F

06/26 01:17, , 31F
不是rvalue refer相關產物的rvalue
06/26 01:17, 31F

06/26 02:40, , 32F
冒味請教,那些編號該怎麼查 ? 上 C 大連結 Ctrl+F 找不到.
06/26 02:40, 32F

06/26 02:47, , 33F
ISO/IEC 14882:2011 Programming Language C++-draft
06/26 02:47, 33F

06/26 02:47, , 34F
點draft會連到一個n3242.pdf
06/26 02:47, 34F

06/26 02:48, , 35F
這個就是了
06/26 02:48, 35F

06/26 02:50, , 36F
謝謝 d 大 , 也謝謝 loveme~ 大 :)
06/26 02:50, 36F
文章代碼(AID): #1Fw5iLmp (C_and_CPP)