从函数传递到 main 时,C++ 如何处理向量?

-1 c++ cout stdvector c++11

我在生成整数二进制表示的“简单”函数的输出中看到了奇怪的行为。我打算在另一个代码中使用该函数,但首先希望通过打印到控制台来查看它的工作情况。我首先定义函数 dec2bin 以获取一个数字和所需位串的长度。定义函数返回的向量后,向量将填充所需的二进制值。在主函数中,向量被访问并按元素打印到控制台。但是,除非我在填充 for 循环的向量中包含任意 cout 语句,否则输出是不正确的。

该函数定义如下:

vector<int> dec2bin(int N, int j){
    vector<int> myvec;
    myvec.push_back(N);
    for (int i = N-1; i >= 0; i--) {
        int r = j >> i;
        if (r & 1)
            myvec[N-i-1] = 1;
        else 
            myvec[N-i-1] = 0;
        //cout << " ";
    }
    return myvec;
}
Run Code Online (Sandbox Code Playgroud)

我的主要功能是:

int main(){
    int length = 8;
    int num = 15;
    vector<int> myvec = dec2bin(length,num);
    for (int j=0; j<length; j++){cout << myvec[j];}
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当注释掉的行 (cout << " ") 包含在 for 循环中时,输出是正确的,为 00001111。没有该行(或 for 循环之外的行),输出错误地为 00001141130。

我已经阅读了有关指针和内存分配的各种内容,所以预计这是我出错的地方;但是,我不太明白如何将这些想法融入我自己的代码中。任何建议将不胜感激,非常感谢。

for*_*818 5

在这一行:

myvec[N-i-1] = 1;
Run Code Online (Sandbox Code Playgroud)

您正在为0.以外的任何索引调用未定义的行为。

myvec.push_back(N);将单个元素推送到向量,并且永远不会向向量添加更多元素。当您越界访问向量时,您不会收到编译器错误或运行时异常,但您的代码具有未定义的行为,这意味着输出实际上可以是任何内容。

其实,这好像你只是混淆push_back()使用resize()。而不是resize(),您可以将大小传递给构造函数。如果更换:

vector<int> myvec;
myvec.push_back(N);
Run Code Online (Sandbox Code Playgroud)

和:

std::vector<int> myvec(N);
Run Code Online (Sandbox Code Playgroud)

或者:

std::vector<int> myvec;
myvec.resize(N);
Run Code Online (Sandbox Code Playgroud)

您会得到一个包含N元素的向量,并且可以访问myvec[i]任何 index 0 <= i < N。或者,您可以调用myvec.reserve(10)让向量为N元素分配空间。然后向量仍然是空的,您必须添加push_back()任何要添加的元素。