2013-10-19 312 views
0

我想在C++中使用算法庫中的sort()。我可以找到排序向量只有的例子,因此我試圖通過初始化的數組初始化一個向量。執行時,我遇到了分段錯誤,無法找出我寫的代碼中出現了什麼問題。C++初始化數組初始化向量時的分段錯誤

#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; 

}

+0

你可以用'的std :: sort'有一個數組就好了。初始化矢量的相同迭代器是您傳遞給算法的東西。 – chris

+1

編譯時如何得到分段錯誤? – Kunal

+0

對於排序,請使用「sort(packets.begin(),packets.end());」如果這就是你的意思。 – kfsone

回答

2
*(packets.end()) 

packets.end()返回一個迭代的元件,所述向量的最後元件下面。

試圖解除它會導致未定義的行爲。

+0

我一直使用,因爲你提到除非我不想解除引用值。 – Shivendra

+0

對不起,明白了。謝謝。 packet.end() - 1會做什麼? – Shivendra

+0

@Shivendra如果你想引用最後一個元素,爲什麼不使用'packet.back()'。 – Kunal

1

註釋說明你可以對數組使用排序(如果你看http://en.cppreference.com/w/cpp/algorithm/sort你會看到sort有兩個參數:-RandomIt must meet the requirements of ValueSwappable and RandomAccessIterator.。普通指針滿足這個要求)。

在您的例子,該段錯誤發生,因爲您嘗試取消引用valid but undereferencable迭代器(通過返回的迭代器「端()」中的:。min=*(packets.begin())- *(packets.end());基本上它返回一個指向after向量的最後一個元素的迭代如果你想得到一個迭代器到最後一個元素,你可以使用rbegin(),但是當然你需要確保矢量是不是空的第一個)。

您可能已經通過調試器下運行你的代碼很容易看出這一點,你會看到分段錯誤無關與呼叫sort