0

我想在 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("%d\n",*stop- *start );

return 0;

}

4

2 回答 2

2
*(packets.end())

packets.end()在向量的最后一个元素之后返回元素的迭代器。

试图取消引用它会导致未定义的行为。

于 2013-10-19T17:15:12.497 回答
1

评论解释说,您可以很好地对数组使用排序(如果您查看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

于 2013-10-19T17:18:38.077 回答