-2

ここに問題があります: 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 モードを使用していると書かれています。ありがとう

4

3 に答える 3

4

範囲ベースのループは、インデックスではなくベクトルの値を返します。

//This:
for (int i = 0; i < ar.size(); ++i) {
   std::cout << ar.at(i) << std::endl;
}
//means this:
for (int val : ar) {
   std::cout << val << std::endl;
}

の欠如に注意してくださいat

于 2013-10-08T10:46:09.120 に答える
3

範囲ベースの for ループに使用される変数はインデックスではなく、実際の値です。たとえば、範囲ベースの for ループがどのように機能するかについても示しているこのリファレンスを参照してください。

また、最初のループを変更するのを忘れていました。

于 2013-10-08T10:46:32.803 に答える
2

ライン

left.at(j)

に置き換える必要があります

j

j はインデックスではなく、値になりました

于 2013-10-08T10:45:53.993 に答える