2015-01-07 90 views
4

我有std::bitset但現在我想對它使用STL算法。在std :: bitset和std :: vector之間轉換<bool>

我可以用std::vector<bool>代替,但我喜歡std::bitset的構造函數,我想std::bitset的按位運算。

我是否必須經過一個循環並將所有內容填入std::vector<bool>以使用STL算法,然後將其複製回std::bitset,或者有更好的方法嗎?

+2

你要在BitSet的位用什麼算法? – wilx

+0

@VáclavZeman最初我想使用'std :: reverse',但是當我發現'std :: bitset'不會讓我使用STL算法時,我只想找到一種方法來使用它們一般。 –

+1

你可以編寫合適的迭代器和一對獨立的'begin()'和'end()'函數。 – milleniumbug

回答

0

馬修Austern寫了一個迭代器bitset這裏:http://www.drdobbs.com/the-standard-librarian-bitsets-and-bit-v/184401382?pgno=2

它有100個多行,所以我覺得自己只是舉起它,並把它放在這個答案可能有點出界。但它對STL算法非常有用。

Austern回答這個確切的問題:

雖然位集不具備STL容器接口,它仍然是一個非常好的(固定大小的)容器。如果你使用bitset是合理的,如果你還需要迭代器,那麼你可以定義一個簡單的「索引迭代器」適配器,它將像i這樣的迭代器符號轉換爲像b [n]這樣的數組符號。實現很簡單:維護一個索引和一個指向容器的指針。

他並警告他的迭代器:

如果我們願意接受一個稍微繁瑣的界面中,我們可以定義任意陣列樣類型的工作類。處理pre-STL容器類時,通常使用的索引迭代器適配器通常很有用,有時甚至在處理像vector這樣的STL容器時也是如此。

還應當指出的是,就像用一個vector<bool>::iterator,Austern的bitset_iterator::operator*沒有返回bool&但代理參考:bitset<>::reference

bitset_iterator用法是這樣的:

std::bitset<10> foo; 
std::vector<bool> bar(begin(foo), end(foo)); 
1

如果你不想寫使用bitsetoperator[],那麼你可以嘗試使用bitset::to_string()以位集轉換成的'1''0'字符串循環。從C++ 11開始,實際上你可以選擇不同於這兩個的字符,所以你可以選擇'\0''\1'

您確定bitset是您的任務的最佳類型?

+0

看起來像一個循環會比這個解決方案更好...我並不完全反對循環它似乎應該有更清潔的東西。至於使用'std :: bitset' ...我認爲呢?在數字和數組之間來回轉換的靈活性很難被打敗。 –

相關問題