ここに問題があります: https://www.hackerrank.com/challenges/quicksort1 以前に HackerRank で問題を解決し始めたとき、次のように単純な for ループを使用して解決しました。
#include <iostream>
#include <vector>
using namespace std;
void partition(vector <int> ar){
vector <int> left;
vector <int> right;
int p=ar.at(0);
for (int i=1;i<ar.size();i++){
if (ar.at(i)<=p) left.push_back(ar.at(i));
else if (ar.at(i)>p) right.push_back(ar.at(i));
}
for (int j=0;j<left.size();j++) cout <<left.at(j)<< " ";
cout << ar.at(0)<< " ";
for (int j=0;j<right.size();j++) cout <<right.at(j)<< " ";
}
int main(){
int n;
cin >> n;
vector <int> num;
for (int i=0;i<n;i++){
int temp;
cin >> temp;
num.push_back(temp);
}
partition(num);
return 0;
}
今日、範囲ベースの for ループについて知ったので、HackerRank コンパイラがそれらをサポートしているかどうかを調べたいと思いました。コードに次の変更を加えました。
#include <iostream>
#include <vector>
using namespace std;
void partition(vector <int> ar){
vector <int> left;
vector <int> right;
int p=ar.at(0);
for (int i=1;i<ar.size();i++){
if (ar.at(i)<=p) left.push_back(ar.at(i));
else if (ar.at(i)>p) right.push_back(ar.at(i));
}
for (int j : left) cout <<left.at(j)<< " ";
cout << ar.at(0)<< " ";
for (int j : right) cout <<right.at(j)<< " ";
}
int main(){
int n;
cin >> n;
vector <int> num;
for (int i=0;i<n;i++){
int temp;
cin >> temp;
num.push_back(temp);
}
partition(num);
return 0;
}
両方のケースでセグメンテーション違反が発生しています。
Testcase# 1
Input
5 4 5 3 7 2
Your Output
~ no response on stdout ~
Expected Output
3 2 4 5 7
Compiler Message
Segmentation Fault
Error
terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check Aborted (core dumped)
Testcase# 2
Input
9 2 10 3 7 9 4 6 12 8
Your Output
2
Expected Output
2 10 3 7 9 4 6 12 8
Compiler Message
Segmentation Fault
Error
terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check Aborted (core dumped)
範囲ベースのループを使用している方法に何か問題がありますか、それとも HackerRank がそれらをサポートしていませんか? このページ ( https://www.hackerrank.com/environment ) には、g++ 4.7.3、C0x モードを使用していると書かれています。ありがとう