#include<iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
int main (void)
{
int z,foo,t,n,k,i;
cin>>t;
while (t--)
{
vector<int> a;
vector<int> b;
cin>>n>>k;
z = n;
while (z--)
{
cin>>foo;
a.push_back(foo);
}
sort(a.begin(),a.end());
vector<int>::iterator it = a.begin();
vector<int>::iterator bt = a.begin();
while (bt != a.end())
{
bt = bt + (k-1);
foo = *bt - *it;
b.push_back(foo);
it++;
}
sort(b.begin(),b.end());
cout<<b[0]<<"\n";
}
return 0;
}
这段代码接受测试用例的数量,然后接受两个数字,然后取数字的总数,并排序,在k
的基础上取它们的差值并排序,复制在一个新 vector 中并对它们进行排序并输出一个新元素。
上面的代码给出了一个段错误。
最佳答案
在循环的每次迭代中,您将 bt
移动 k - 1
步
bt = bt + (k-1);
bt
的初值为a.begin()
,循环继续条件为bt != a.end()
。如果 a
(即 n
)的大小不能被 k - 1
整除,则 bt
永远不会相等到 a.end()
并且循环将永远不会正确终止。它会将 bt
推出有效范围。
此时行为将是未定义的。代码通常会崩溃。
关于c++ - 这段 C++ 代码在给出段错误时有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26311553/