微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我在生成整数二进制表示的“简单”函数输出中看到了奇怪的行为。我打算在另一个代码中使用该函数,但首先希望通过打印到控制台来查看它的工作情况。我首先定义函数 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;
}

我的主要功能是:

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

当注释掉的行 (cout

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

解决方法

在这一行:

myvec[N-i-1] = 1;

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

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

实际上,您似乎只是将 push_back()resize() 混淆了。您可以将大小传递给构造函数,而不是 resize()。如果更换:

vector<int> myvec;
myvec.push_back(N);

与:

std::vector<int> myvec(N);

或:

std::vector<int> myvec;
myvec.resize(N);

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

,

您正在访问未分配的内存,因为您只推回 (push_back()) 一次,因此您会遇到未定义的行为。 您应该使用 .at() 函数而不是 [] 运算符来访问向量元素,它会抛出超出范围的异常。

您需要使用 push_back() 插入到向量中,或者您可以在向量声明期间使用 vector.resize(size),然后它会避免未定义的行为。

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。