2009-02-15 124 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()成员来访问原始字节。

相关问题