std::C+中引发的超出范围异常+;合并排序实现 是我在C++中实现的合并排序。为了便于调试,我采用了较小的输入大小。在纠正了导致引发std::out_of_range异常的一个小错误后,合并排序代码仍然不起作用 #include <iostream> #include <chrono> #include <fstream> #include <vector> using namespace std; using namespace std::chrono; void mergeSort(vector<long>, long, long); void merge(vector<long>, long, long, long); void sortf(long); void print(long); void print(long n) //prints n random numbers in a file { ofstream of("List.txt"); long i; for (i = 0; i < n; i++) { long x = rand() % n + 1; of << x << endl; } of.close(); } void sortf(long x) //calls the merge sort function and sends it array of elements which { //were previously stored in the file and outputs sorted values to another file vector<long> arr; ifstream f("List.txt"); long i = 0; long line; while (i < x) { f >> line; arr.push_back(line); i++; } high_resolution_clock::time_point t1 = high_resolution_clock::now(); long len = arr.size() - 1; mergeSort(arr, 0, len); //calls merge sort high_resolution_clock::time_point t2 = high_resolution_clock::now(); auto duration = duration_cast<nanoseconds>(t2 - t1).count(); cout << "\nTime taken:\n" << duration << " nanoseconds.\n"; //outputs time taken ofstream of("ListOut3.txt"); for (i = 0; i < x; i++) { cout << arr.at(i) << endl; } for (i = 0; i < x; i++) { of << arr.at(i) << endl; } } void mergeSort(vector<long> arr, long l, long r) { long n = arr.size(); if (l >= r) //Base condition to stop recursion { return; } long mid = (l + r) / 2; //calculates mid position for partitioning mergeSort(arr, l, mid); mergeSort(arr, (mid + 1), r); merge(arr, l, mid, r); } void merge(vector<long> arr, long l, long mid, long r) //applies merging { vector<long> lv; vector<long> rv; int p; for (p = l; p < mid; p++) { lv.push_back(arr.at(p)); } for (p = mid; p < r; p++) { rv.push_back(arr.at(p)); //Error Solved } long l1 = lv.size(); long l2 = rv.size(); long i = 0, j = 0, k = 0; while (i < l1 && j < l2) { if (lv.at(i) < rv.at(j)) { arr.at(k) = lv.at(i); i++; } else { arr.at(k) = rv.at(j); j++; } k++; } while (i < l1) { arr.at(k) = lv.at(i); k++; i++; } while (j < l2) { arr.at(k) = rv.at(j); k++; j++; } } int main() { long n = 4; print(n); //printing n numbers in the file sortf(n); }

std::C+中引发的超出范围异常+;合并排序实现 是我在C++中实现的合并排序。为了便于调试,我采用了较小的输入大小。在纠正了导致引发std::out_of_range异常的一个小错误后,合并排序代码仍然不起作用 #include <iostream> #include <chrono> #include <fstream> #include <vector> using namespace std; using namespace std::chrono; void mergeSort(vector<long>, long, long); void merge(vector<long>, long, long, long); void sortf(long); void print(long); void print(long n) //prints n random numbers in a file { ofstream of("List.txt"); long i; for (i = 0; i < n; i++) { long x = rand() % n + 1; of << x << endl; } of.close(); } void sortf(long x) //calls the merge sort function and sends it array of elements which { //were previously stored in the file and outputs sorted values to another file vector<long> arr; ifstream f("List.txt"); long i = 0; long line; while (i < x) { f >> line; arr.push_back(line); i++; } high_resolution_clock::time_point t1 = high_resolution_clock::now(); long len = arr.size() - 1; mergeSort(arr, 0, len); //calls merge sort high_resolution_clock::time_point t2 = high_resolution_clock::now(); auto duration = duration_cast<nanoseconds>(t2 - t1).count(); cout << "\nTime taken:\n" << duration << " nanoseconds.\n"; //outputs time taken ofstream of("ListOut3.txt"); for (i = 0; i < x; i++) { cout << arr.at(i) << endl; } for (i = 0; i < x; i++) { of << arr.at(i) << endl; } } void mergeSort(vector<long> arr, long l, long r) { long n = arr.size(); if (l >= r) //Base condition to stop recursion { return; } long mid = (l + r) / 2; //calculates mid position for partitioning mergeSort(arr, l, mid); mergeSort(arr, (mid + 1), r); merge(arr, l, mid, r); } void merge(vector<long> arr, long l, long mid, long r) //applies merging { vector<long> lv; vector<long> rv; int p; for (p = l; p < mid; p++) { lv.push_back(arr.at(p)); } for (p = mid; p < r; p++) { rv.push_back(arr.at(p)); //Error Solved } long l1 = lv.size(); long l2 = rv.size(); long i = 0, j = 0, k = 0; while (i < l1 && j < l2) { if (lv.at(i) < rv.at(j)) { arr.at(k) = lv.at(i); i++; } else { arr.at(k) = rv.at(j); j++; } k++; } while (i < l1) { arr.at(k) = lv.at(i); k++; i++; } while (j < l2) { arr.at(k) = rv.at(j); k++; j++; } } int main() { long n = 4; print(n); //printing n numbers in the file sortf(n); },c++,exception,vector,stl,mergesort,C++,Exception,Vector,Stl,Mergesort,请帮我找出原因,因为我不熟悉STL和vectors。更改了代码,以便通过引用传递矢量。现在,它工作正常,并提供所需的输出。以下是正确的工作解决方案: #include <iostream> #include <cstdlib> #include <chrono> #include <fstream> #include <array> #include <vector> using namespace std; using

请帮我找出原因,因为我不熟悉STL和vectors。

更改了代码,以便通过引用传递矢量。现在,它工作正常,并提供所需的输出。以下是正确的工作解决方案:

#include <iostream>
#include <cstdlib>
#include <chrono>
#include <fstream>
#include <array>
#include <vector>

using namespace std;
using namespace std::chrono;

void mergeSort(vector<long>&, long, long);
void merge(vector<long>&, long, long, long);
void sortf(long);
void print(long);

void print(long n) //prints n random numbers in a file
{
    ofstream of("List.txt");
    long i;
    for (i = 0; i < n; i++)
    {
        long x = rand() % n + 1;
        of << x << endl;
    }
    of.close();
}

void sortf(long x) //calls the merge sort function and sends it array of elements which
{ //were previously stored in the file and outputs sorted values to another file
    vector<long> arr;
    ifstream f("List.txt");
    long i = 0;
    long line;
    while (i < x)
    {
        f >> line;
        arr.push_back(line);
        i++;
    }
    high_resolution_clock::time_point t1 = high_resolution_clock::now();

    long len = arr.size() - 1;
    mergeSort(arr, 0, len); //calls merge sort

    high_resolution_clock::time_point t2 = high_resolution_clock::now();
    auto duration = duration_cast<nanoseconds>(t2 - t1).count();
    cout << "\nTime taken:\n" << duration << " nanoseconds.\n"; //outputs time taken 
    ofstream of("ListOut3.txt");
    for (i = 0; i < x; i++)
    {
        cout << arr.at(i) << endl;
    }
    for (i = 0; i < x; i++)
    {
        of << arr.at(i) << endl;
    }
}

void mergeSort(vector<long> &arr, long l, long r)
{
    if (l >= r) //Base condition to stop recursion
    {
        return;
    }

    long mid = (l + r) / 2; //calculates mid position for partitioning

    mergeSort(arr, l, mid);
    mergeSort(arr, (mid + 1), r);
    merge(arr, l, mid, r);
}

void merge(vector<long> &arr, long l, long mid, long r) //applies merge sort algorithm
{
    vector<long> lv;
    vector<long> rv;

    int p;
    for (p = l; p <= mid; p++)
    {
        lv.push_back(arr.at(p));
    }
    for (p = mid+1; p <= r; p++)
    {
        rv.push_back(arr.at(p));
    }

    long l1 = lv.size();
    long l2 = rv.size();

    long i = 0, j = 0, k = l;

    while (i < l1 && j < l2)
    {
        if (lv.at(i) < rv.at(j))
        {
            arr.at(k) = lv.at(i);
            i++;
        }
        else
        {
            arr.at(k) = rv.at(j);
            j++;
        }
        k++;
    }
    while (i < l1)
    {
        arr.at(k) = lv.at(i);
        k++;
        i++;
    }
    while (j < l2)
    {
        arr.at(k) = rv.at(j);
        k++;
        j++;
    }
}

int main()
{
    long n = 60;
    print(n); //printing n numbers in the file
    sortf(n);
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
无效合并排序(向量&长,长);
无效合并(向量和,长,长,长);
无效sortf(长);
空白打印(长);
void print(long n)//在文件中打印n个随机数
{
的流(“List.txt”);
龙我;
对于(i=0;i解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,您应该逐行检查代码。有关更多帮助,请阅读。至少,您应该[编辑]您的问题将包括一个重现您的问题的示例,以及您在调试器中所做的观察。我已逐行调试了我的代码。我还提到了注释中遇到错误的确切位置。我只是无法确定错误背后的原因。我的代码中肯定存在逻辑错误代码,但我找不到它。我需要的帮助不是识别错误在哪里,而是识别导致该特定错误的确切原因。好吧,原因是在该点上有一个空向量。请检查为什么它不是从另一个向量复制的,或者没有按预期的方式填充。此外,我也无法找出原因为什么我的catch块中包含的消息“遇到!”,会被打印两次。
rv
显然是一个未初始化的空向量。您的意思是用特定的大小初始化它,如:
vector rv(arr.size);
#include <iostream>
#include <cstdlib>
#include <chrono>
#include <fstream>
#include <array>
#include <vector>

using namespace std;
using namespace std::chrono;

void mergeSort(vector<long>&, long, long);
void merge(vector<long>&, long, long, long);
void sortf(long);
void print(long);

void print(long n) //prints n random numbers in a file
{
    ofstream of("List.txt");
    long i;
    for (i = 0; i < n; i++)
    {
        long x = rand() % n + 1;
        of << x << endl;
    }
    of.close();
}

void sortf(long x) //calls the merge sort function and sends it array of elements which
{ //were previously stored in the file and outputs sorted values to another file
    vector<long> arr;
    ifstream f("List.txt");
    long i = 0;
    long line;
    while (i < x)
    {
        f >> line;
        arr.push_back(line);
        i++;
    }
    high_resolution_clock::time_point t1 = high_resolution_clock::now();

    long len = arr.size() - 1;
    mergeSort(arr, 0, len); //calls merge sort

    high_resolution_clock::time_point t2 = high_resolution_clock::now();
    auto duration = duration_cast<nanoseconds>(t2 - t1).count();
    cout << "\nTime taken:\n" << duration << " nanoseconds.\n"; //outputs time taken 
    ofstream of("ListOut3.txt");
    for (i = 0; i < x; i++)
    {
        cout << arr.at(i) << endl;
    }
    for (i = 0; i < x; i++)
    {
        of << arr.at(i) << endl;
    }
}

void mergeSort(vector<long> &arr, long l, long r)
{
    if (l >= r) //Base condition to stop recursion
    {
        return;
    }

    long mid = (l + r) / 2; //calculates mid position for partitioning

    mergeSort(arr, l, mid);
    mergeSort(arr, (mid + 1), r);
    merge(arr, l, mid, r);
}

void merge(vector<long> &arr, long l, long mid, long r) //applies merge sort algorithm
{
    vector<long> lv;
    vector<long> rv;

    int p;
    for (p = l; p <= mid; p++)
    {
        lv.push_back(arr.at(p));
    }
    for (p = mid+1; p <= r; p++)
    {
        rv.push_back(arr.at(p));
    }

    long l1 = lv.size();
    long l2 = rv.size();

    long i = 0, j = 0, k = l;

    while (i < l1 && j < l2)
    {
        if (lv.at(i) < rv.at(j))
        {
            arr.at(k) = lv.at(i);
            i++;
        }
        else
        {
            arr.at(k) = rv.at(j);
            j++;
        }
        k++;
    }
    while (i < l1)
    {
        arr.at(k) = lv.at(i);
        k++;
        i++;
    }
    while (j < l2)
    {
        arr.at(k) = rv.at(j);
        k++;
        j++;
    }
}

int main()
{
    long n = 60;
    print(n); //printing n numbers in the file
    sortf(n);
}