我在代碼期間出現分段錯誤,我想知道爲什麼。我正在猜測它與vector.erase()
函數之間的關係。在向量中使用擦除的C++分段錯誤
#include <iostream>
#include <vector>
#include <math.h>
long long gcd(long long x, long long y);
std::vector<long long> factor(long long x);
typedef std::vector<long long> vectorNum;
int main(int argc, const char * argv[])
{
// insert code here...
long long unFriendly;
long long friendly;
long long counter = 0;
std::cin >> unFriendly;
std::cin >> friendly;
vectorNum n;
n = factor(friendly);
for(long long x = 0;x < unFriendly;x++){
long long num = 0;
std::cin >> num;
counter = gcd(friendly, num);
for(long long y = n.size() - 1;y >= 0;y--){
vectorNum temp(n);
if(counter % n.at(y) == 0){
n.erase(n.begin() + y);
}
}
}
std::cout<<n.size();
n.clear();
}
long long gcd(long long x, long long y){
while(y != 0){
long long a = x % y;
x = y;
y = a;
}
return x;
}
std::vector<long long> factor(long long x){
long long y;
long long root = sqrt(x);
std::vector<long long> vectorSet;
for(y = 2; y <= root;y++){
if(x % y == 0){
vectorSet.push_back(y);
vectorSet.push_back(x/y);
}
}
vectorSet.push_back(x);
return vectorSet;
}
任何一種洞察力都是完美的!提前致謝。 這是被調用的兩個函數。根據要求,gcd()
和factors()
功能。
哪裏有gcd和factor的實現 – aaronman
帶有erase()的for()循環看起來有點奇怪,你爲什麼要把整個向量複製到一個棧?在擦除之後,y可能會超出範圍,從而導致您觀察到的崩潰。 – Karadur
如果'n'爲空,則'y'超出範圍。你在調試器下運行嗎?我問,因爲它花了我不到一分鐘在Visual Studio調試器下運行,看看這段代碼拋出'std :: out_of_range'。 – Joel