我想在C++的算法库中使用 sort()。我只能找到对向量进行排序的示例,因此我正在尝试通过初始化的数组初始化向量。执行时,我遇到了分段错误,无法弄清楚我编写的代码中出了什么问题。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n,k,packet[1000],min=0;
scanf("%d",&n);
scanf("%d",&k);
for (int i = 0; i < n; ++i)
{
scanf("%d",&packet[i]);
cout<<i<<endl;
}
cout<<"debug";
vector<int> packets(packet,packet+n);
vector<int>::iterator start,stop;
sort(packets.begin(),packets.begin()+n);
min=*(packets.begin())- *(packets.end());
cout<<min;
for (vector<int>::iterator it=packets.begin(); it!=packets.end()-k; ++it)
{
printf("%d ",*it );
if((*(it+k) - *it)<min)
{
start=it;
stop=it+k;
}
}
printf("%dn",*stop- *start );
return 0;
}
*(packets.end())
packets.end()
在向量的最后一个元素之后向元素返回一个迭代器。
尝试取消限制会导致未定义的行为。
注释解释说,您可以很好地对数组使用排序(如果您查看 http://en.cppreference.com/w/cpp/algorithm/sort 您会发现sort
需要两个参数:-RandomIt must meet the requirements of ValueSwappable and RandomAccessIterator.
.纯指针满足此要求)。
在您的示例中,发生段错误是因为您尝试取消引用valid but undereferencable
迭代器(迭代器由 'end()' 返回: min=*(packets.begin())- *(packets.end());
.基本上,它返回一个迭代器,该迭代器指向after
向量的最后一个元素。如果你想得到最后一个元素的迭代器,你可以使用 rbegin()
当然你需要确保向量不是空的)。
通过在调试器下运行代码,您可以很容易看到这一点,您会发现分段错误与调用无关sort