std::sort 调用导致下标超出范围编译时错误

mmo*_*el1 10 c++ arrays sorting

下面的代码无法编译并出现错误:“数组下标 16 超出 \xe2\x80\xa6 的数组范围”。\n我不明白为什么,w保证是 <= arr1.size()。

\n

https://godbolt.org/z/5n5KohsnW

\n
#include <array>\n#include <algorithm>\n#include <tuple>\n\nextern bool test_func();\n\nint tempfunc() \n{\n    std::array<std::tuple<double,int>,5> arr1;\n    int w = 0;\n    for (int i = 0; i < 5; ++i ) {\n        if( test_func()) {\n            arr1[w] = {3.,4};\n            w++;\n        }\n    }\n    std::sort(arr1.begin(), arr1.begin() + w);\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Cor*_*nel -1

该错误可能是由不同编译器上的不同行为引起的。也与 w 变量相关,因为函数 bool test_func(); 可以返回 false 作为循环内的 if 条件,这意味着每次完成时 w 的值都不能保证为 5(可能会更小,具体取决于函数返回)。

您可以通过将排序行中的 w 更改为 5 来解决这个问题,或者更好的 arr1.size() 也可以,因为它的大小将是最初声明的 5。

std::sort(arr1.begin(), arr1.begin() + 5);
Run Code Online (Sandbox Code Playgroud)

或者用这个代替:

std::sort(std::begin(arr1), std::end(arr1));
Run Code Online (Sandbox Code Playgroud)

另外,要打印每个元组的值,请在循环中尝试以下操作:

std::cout << "First is: " << std::get<0>(arr1[i]) << " and Second is " << std::get<1>(arr1[i]) << std::endl;
Run Code Online (Sandbox Code Playgroud)