-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 循环的变量不是索引,而是实际值。参见例如this reference,它还显示了基于范围的for循环是如何工作的。

你也忘了改变你的第一个循环。

于 2013-10-08T10:46:32.803 回答
2

线

left.at(j)

应该替换为

j

j 现在不是索引,而是值

于 2013-10-08T10:45:53.993 回答