我有一个函数返回bitset
s的向量,其中包含其输入的ASCII值。
typedef bitset<64> block;
vector<block> input_to_binary(string s)
{
vector<block> v;
block blk;
int j = blk.size() - 1;
for (int i = 0; i < s.size(); i++)
{
bitset<8> b(s[i]);
for (int k = b.size() - 1; k >= 0; k--)
{
blk[j] = b[k];
j--;
}
if (i % 8 == 7 || i == s.size() - 1)
{
// either the block is full now or this is the last character of the input
v.push_back(blk);
j = blk.size() - 1;
这个功能很好:
cout << "Just after the push:" << endl;
for (int i = 0; i < v.size(); i++)
{
block blk = v[i];
for (int i = blk.size() - 1; i >= 0; i--)
cout << blk[i] << "\t";
}
}
}
return v;
}
Just after the push: 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
返回main()
后,bitset
s'数据丢失了:
int main()
{
string s = "Hello, Hi, Goodbye";
vector<block> v = input_to_binary(s);
cout << "v.size() is " << v.size() << endl;
for (int i = 0; i < v.size(); i++)
{
// block current = v[i]; // tried either one
block current(v[i]);
cout << "block no. " << i << " with size " << current.size() << endl;
for (int j = current.size() - 1; j >= 0; j--)
cout << current[i] << "\t";
cout << endl;
}
}
v.size() is 3 block no. 0 with size 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
为什么会这样?它是关于bitset
的复制构造函数,我认为应该可以正常工作吗?
答案 0 :(得分:8)
(您可能希望在进一步阅读之前先进行一些额头保护)
cout << current[i] << "\t";
你是说j吗?您将第一个元素打印64次 - 并根据函数中的输出,该值为0.
有时你盯着代码这么长时间,你开始真正看到你的假设,而不是屏幕上的内容:)去休息吧!你应得的。
看起来STL作者是安全的......至少目前是这样:-D