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

Goh*_*ans 4 c++ vector pass-by-value bitset

我有一个函数返回bitset包含其输入的ASCII值的s 向量.

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;
Run Code Online (Sandbox Code Playgroud)

在函数内部都很好:

            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;
}
Run Code Online (Sandbox Code Playgroud)

    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(),bitsets'数据丢失了:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

xax*_*xon 8

(在进一步阅读之前,你可能想要一些额头保护)

        cout << current[i] << "\t";
Run Code Online (Sandbox Code Playgroud)

你的意思是j?您将打印出第一个元素64次 - 并根据函数内的输出,该值为0.

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

看起来STL作家是安全的......至少目前如此:-D