从函数传递到 main 时,C++ 如何处理向量?
How does C++ handle vectors when passing from a function to main?
我在生成整数的二进制表示的 'simple' 函数的输出中看到奇怪的行为。我的目标是在另一个代码中使用该函数,但首先想通过打印到控制台来查看它是否正常工作。我首先定义函数 dec2bin 以获取数字和所需位串的长度。定义函数将返回的向量后,向量将填充所需的二进制值。在 main 函数中,向量被访问并按元素打印到控制台。但是,除非我在填充 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 << " ") 包含在 for 循环中时,输出是正确的,带有 00001111。如果没有该行(或 for 循环外部的行),则输出不正确为 00001141130 .
我已经阅读了关于指针和内存分配的各种内容,所以我想这就是我出错的地方;但是,我不太明白如何将这些想法合并到我自己的代码中。非常感谢任何建议,非常感谢。
这一行:
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
个元素分配 space。然后向量仍然是空的,你必须push_back()
任何你想添加的元素。
您正在访问未分配的内存,因为您只推回 (push_back()
) 一次,因此您会得到未定义的行为。
您应该使用 .at()
函数而不是 []
运算符来访问向量元素,它会抛出异常。
您需要使用 push_back()
插入到向量中,或者您可以在向量声明期间使用 vector.resize(size)
,这样可以避免未定义的行为。
谢谢
我在生成整数的二进制表示的 'simple' 函数的输出中看到奇怪的行为。我的目标是在另一个代码中使用该函数,但首先想通过打印到控制台来查看它是否正常工作。我首先定义函数 dec2bin 以获取数字和所需位串的长度。定义函数将返回的向量后,向量将填充所需的二进制值。在 main 函数中,向量被访问并按元素打印到控制台。但是,除非我在填充 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 << " ") 包含在 for 循环中时,输出是正确的,带有 00001111。如果没有该行(或 for 循环外部的行),则输出不正确为 00001141130 .
我已经阅读了关于指针和内存分配的各种内容,所以我想这就是我出错的地方;但是,我不太明白如何将这些想法合并到我自己的代码中。非常感谢任何建议,非常感谢。
这一行:
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
个元素分配 space。然后向量仍然是空的,你必须push_back()
任何你想添加的元素。
您正在访问未分配的内存,因为您只推回 (push_back()
) 一次,因此您会得到未定义的行为。
您应该使用 .at()
函数而不是 []
运算符来访问向量元素,它会抛出异常。
您需要使用 push_back()
插入到向量中,或者您可以在向量声明期间使用 vector.resize(size)
,这样可以避免未定义的行为。
谢谢