在C++中通过初始化数组初始化向量时出现分段错误



我想在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

相关内容

  • 没有找到相关文章

最新更新