mmo*_*el1 10 c++ arrays sorting
下面的代码无法编译并出现错误:“数组下标 16 超出 \xe2\x80\xa6 的数组范围”。\n我不明白为什么,w保证是 <= arr1.size()。
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}\nRun 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)