2009-02-15 89 views
2

我有類似下面的內容,並且在填充任意數量的位之後,我需要獲取要寫入文件的字節。我沒有辦法做到這一點,它似乎很有用,所以我必須錯過一些東西。有任何想法嗎?從std :: vector獲取字節<bool>

std::vector<bool> a; 

a.push_back(true); 
a.push_back(false); 
a.push_back(false); 
a.push_back(true); 

a.push_back(false); 
a.push_back(true); 
a.push_back(true); 
a.push_back(false); 
+0

可以肯定:你是否想要包含打包位的字節?我的意思是,在你給出的例子中,輸出是隻有一個字節,值爲0x96?還有一件事:什麼是期望的endianess? – 2009-02-16 01:16:36

+0

如果沒有可能的方法來讀回輸出函數,是否有必要編寫一個輸出函數?即使你只讀回一個原始字節== 0x00,你仍然不知道矢量的大小。 – MSalters 2009-02-16 09:37:22

+0

我確實想要打包的字節,每個位向量都有可變的位數。 – James 2009-02-16 13:50:09

回答

2

試試這個

void WriteOut(fstream& stream, const vector<bool>& data) { 
    for (vector<bool>::const_iterator it = data.begin(); it != data.end(); it++) { 
    stream << *it; 
    } 
} 
+2

我們能得到一個理由嗎? – JaredPar 2009-02-15 21:29:30

1

一個布爾值,通常是一個字節 - 你可以使用矢量::迭代器簡單地遍歷向量,並訪問每個值的方式。

std::vector<bool> a; 

a.push_back(true); 
a.push_back(false); 

for(std::vector<bool>::iterator iter = a.begin(); iter != a.end(); ++iter) 
{ 
    std::cout << *iter << std::endl; 
} 

將遍歷每個布爾,並打印出來的命令行。打印到文件是相對簡單的。

+1

布爾通常不是一個字節。在許多系統中,它是CPU字大小,例如32位,因爲這比操縱字節更快。 – 2009-02-15 21:59:46

+4

而`vector `不是`bool`的`vector <>`,可以說是C++標準中最糟糕的錯誤特徵。 – 2010-04-08 20:25:18

7

std::vector <bool>實際上並不包含bools(即字節),它包含位!這主要是一個missfeature,建議您使用std::deque <bool>,而不是這個「功能」。

如果你想存儲是連續的,使用std::vector <char>

+1

Yay for template specializes! – JaredPar 2009-02-15 21:11:01

+0

hor bitset。他肯定希望bitset及其op >>和op <<適用於流,或者適用於動態流http://www.poost.org/doc/libs/1_38_0/libs/dynamic_bitset/dynamic_bitset.html – 2009-02-15 23:31:12

0

首先,您要使用bit_vector而不是向量。

其次,沒有辦法用bit_vector或vector來完成你想要的功能。它們被設計成集合及其基礎格式是不可見的(因此它可能會決定存儲每個布爾作爲,而不是打包作爲每字節8位的單個字節。

1

做這樣的事情

std::vector<bool> a; 
a.push_back(true); 
a.push_back(false); 
//... 
for (auto it = a.begin(); it != a.end();) // see 0x for meaning of auto 
{ 
    unsigned b = 0; 
    for (int i = 0; i < 8*sizeof(b); ++i) 
    { 
     b |= (*it & 1) << (8*sizeof(b) - 1 - i); 
     ++it; 
    } 
    // flush 'b' 
} 

所以,你最終要做的是將大塊位分組在一起,在這裏我選擇將位分組爲本地整數(這對於目標平臺來說是最佳的),我不檢查索引,但那是你我必須做的是,我會檢查我可以先抽出多少個完整的塊,然後處理剩餘的部分。

另外,請注意,我從左到右填充位(假設目標架構是小端),這意味着首先填充msb。

如果你正在進行位操作和類似的東西,找出你的位打包方案,讓它成爲你的數據結構。 std :: bit_vector,std :: vector或:: dequeue並不重要。巧妙地將你的位打包到目標平臺的本地整數類型中,這將提供最好的性能。

0

其實你可以這樣做:

copy(yourvector.begin(), yourvector.end(), std::ostreambuf_iterator<char>(outputstream)); 
0

我不記得,如果一個std::vector<bool>要求包裝,很可能不是。如果是這樣,你可以訪問它的:: data()成員來訪問原始字節。

相關問題