在C ++中返回一个位集向量

时间:2016-05-02 09:04:58

标签: c++ vector pass-by-value bitset

我有一个函数返回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的复制构造函数,我认为应该可以正常工作吗?

1 个答案:

答案 0 :(得分:8)

(您可能希望在进一步阅读之前先进行一些额头保护)

        cout << current[i] << "\t";
你是说j吗?您将第一个元素打印64次 - 并根据函数中的输出,该值为0.

有时你盯着代码这么长时间,你开始真正看到你的假设,而不是屏幕上的内容:)去休息吧!你应得的。

看起来STL作者是安全的......至少目前是这样:-D