为什么数组上的 std::binary_search 在 cmd 和 linux 终端中给出不同的结果?
Why std::binary_search on an array give different results in cmd and linux terminal?
我试图解决一个 codeforces problem,这需要我使用以下公式找到多边形的内角:
((n-2)*180)/n
;其中 'n' 是多边形的边数。我采用了一个大小为 5 的数组来存储三角形 (n=3) 和正方形 (n=4) 的角度。编写了以下代码以在数组上搜索角度(60 度):
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr [5];
for(int n=3; n<5; n++){
arr[n] = ((n-2)*180)/n;
cout << "arr["<<n<<"] = "<< arr[n];
cout<<endl;
}
if(binary_search(arr, arr+5,60)){
cout << "YES"<<"\n";
}
else{
cout<< "NO"<<"\n";
}
return 0;
}
在命令提示符 (cmd) 上编译和 运行 之后,我得到了以下意想不到的结果:
arr[3] = 60
arr[4] = 90
NO
后来我在 Windows 子系统上为 Linux 尝试了相同的代码,得到了以下正确的输出:
arr[3] = 60
arr[4] = 90
YES
为什么数组中 60 的 std::binary_search() 函数在 cmd 上返回 false?即使它存储在索引 3 处。
为什么它在 linux 终端上工作?
使用的编译器和 C++
系统
g++ --版本
C++ 标准
cmd (Windows)
g++ (MinGW.org GCC-8.2.0-5) 8.2.0
C++14
linux 终端(wsl)
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
C++14
您没有初始化所有数组,这意味着某些元素将具有 不确定 值。以任何方式使用此类不确定的值都会导致 未定义的行为。
如果不应使用某些元素,则需要将它们初始化为某个值以满足二进制搜索要求(正在排序的数组),例如零:
int arr[5] = { 0 }; // Initialize all elements to zero
另一种选择是在进行搜索时仅使用数组的初始化部分:
binary_search(arr + 3, arr + 5, 60)
您得到不同答案的事实是由于未初始化数组块这一事实所产生的未定义行为。
但如果你真的想了解为什么第一个编译器给出的答案与第二个不同,则有必要查看每个编译器生成的机器代码。
Here and here 是由 gcc 8.2 和 gcc 9.3 在 x86-64 中生成的机器代码 architecture.This 行为似乎只是依赖于体系结构(不依赖于 OS)因为对于每个编译器,我得到的结果都和你一样。
我试图解决一个 codeforces problem,这需要我使用以下公式找到多边形的内角:
((n-2)*180)/n
;其中 'n' 是多边形的边数。我采用了一个大小为 5 的数组来存储三角形 (n=3) 和正方形 (n=4) 的角度。编写了以下代码以在数组上搜索角度(60 度):
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr [5];
for(int n=3; n<5; n++){
arr[n] = ((n-2)*180)/n;
cout << "arr["<<n<<"] = "<< arr[n];
cout<<endl;
}
if(binary_search(arr, arr+5,60)){
cout << "YES"<<"\n";
}
else{
cout<< "NO"<<"\n";
}
return 0;
}
在命令提示符 (cmd) 上编译和 运行 之后,我得到了以下意想不到的结果:
arr[3] = 60 arr[4] = 90 NO
后来我在 Windows 子系统上为 Linux 尝试了相同的代码,得到了以下正确的输出:
arr[3] = 60 arr[4] = 90 YES
为什么数组中 60 的 std::binary_search() 函数在 cmd 上返回 false?即使它存储在索引 3 处。 为什么它在 linux 终端上工作?
使用的编译器和 C++
系统 | g++ --版本 | C++ 标准 |
---|---|---|
cmd (Windows) | g++ (MinGW.org GCC-8.2.0-5) 8.2.0 | C++14 |
linux 终端(wsl) | g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 | C++14 |
您没有初始化所有数组,这意味着某些元素将具有 不确定 值。以任何方式使用此类不确定的值都会导致 未定义的行为。
如果不应使用某些元素,则需要将它们初始化为某个值以满足二进制搜索要求(正在排序的数组),例如零:
int arr[5] = { 0 }; // Initialize all elements to zero
另一种选择是在进行搜索时仅使用数组的初始化部分:
binary_search(arr + 3, arr + 5, 60)
您得到不同答案的事实是由于未初始化数组块这一事实所产生的未定义行为。
但如果你真的想了解为什么第一个编译器给出的答案与第二个不同,则有必要查看每个编译器生成的机器代码。
Here and here 是由 gcc 8.2 和 gcc 9.3 在 x86-64 中生成的机器代码 architecture.This 行为似乎只是依赖于体系结构(不依赖于 OS)因为对于每个编译器,我得到的结果都和你一样。