C++ 合并排序实现中抛出的 std::out_of_range 异常

50cal左轮手枪

下面是我在 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);
}

程序的确切输出是:

Time taken:
6897 nanoseconds.
4
3
2
4

请帮我找出原因,因为我是 STL 和向量的新手。

50cal左轮手枪

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

#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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

合并排序算法中的 C++“以未捕获的 std::out_of_range 类型异常终止:向量”错误

来自分类Dev

Microsoft C ++异常:std :: out_of_range错误?

来自分类Dev

异常'out_of_range'不是std的成员?

来自分类Dev

不会引发std :: out_of_range异常

来自分类Dev

不会引发std :: out_of_range异常

来自分类Dev

C ++中带有矢量的'std :: out_of_range'实例

来自分类Dev

C ++:未处理的异常:内存位置处的std :: out_of_range

来自分类Dev

C ++向量:std :: out_of_range错误

来自分类Dev

在C ++中抛出'std :: out_of_range'实例后调用终止

来自分类Dev

错误test.exe中0x76C9FD62的未处理异常:Microsoft C ++异常:内存位置0x006FF870的std :: out_of_range。发生了

来自分类Dev

Mini-Project.exe中0x77031D4D的未处理异常:Microsoft C ++异常:内存位置0x00CFF620的std :: out_of_range

来自分类Dev

C ++ std :: out_of_range在内存位置

来自分类Dev

抛出'std :: out_of_range'实例后调用终止

来自分类Dev

抛出'std :: out_of_range'实例后调用终止

来自分类Dev

使用gcc编译代码后,不会输出std :: out_of_range异常字符串

来自分类Dev

以类型为std :: out_of_range的未捕获异常终止终止错误

来自分类Dev

引发std :: out_of_range异常。“预期的类型说明符”

来自分类Dev

使用gcc编译代码后,不会输出std :: out_of_range异常字符串

来自分类Dev

0x742808F2 处未处理的异常:Microsoft C++ 异常:std::out_of_range 位于内存位置 0x0055E9E4

来自分类Dev

抛出'std :: out_of_range'what():vector :: _ M_range_check实例后终止调用

来自分类Dev

libc ++ abi.dylib:以类型为std :: out_of_range的未捕获异常终止:basic_string错误吗?

来自分类Dev

设置QLineEdit时std :: out_of_range

来自分类Dev

线程创建C ++ std :: thread抛出异常

来自分类Dev

std :: stoi,std :: setbase和std :: out_of_range错误

来自分类Dev

比较二进制数字输入的字符时,抛出'std :: out_of_range实例后调用终止

来自分类Dev

将字母向前移动 3 个字母的程序,错误:在抛出 'std::out_of_range' 实例后调用终止

来自分类Dev

在C中调试合并排序实现

来自分类Dev

在混合C ++中捕获std异常和系统异常

来自分类Dev

"if (argc < 2 || argc > 2)" 应该有 2 个参数吗?& 在抛出“std::out_of_range”错误实例后调用终止

Related 相关文章

  1. 1

    合并排序算法中的 C++“以未捕获的 std::out_of_range 类型异常终止:向量”错误

  2. 2

    Microsoft C ++异常:std :: out_of_range错误?

  3. 3

    异常'out_of_range'不是std的成员?

  4. 4

    不会引发std :: out_of_range异常

  5. 5

    不会引发std :: out_of_range异常

  6. 6

    C ++中带有矢量的'std :: out_of_range'实例

  7. 7

    C ++:未处理的异常:内存位置处的std :: out_of_range

  8. 8

    C ++向量:std :: out_of_range错误

  9. 9

    在C ++中抛出'std :: out_of_range'实例后调用终止

  10. 10

    错误test.exe中0x76C9FD62的未处理异常:Microsoft C ++异常:内存位置0x006FF870的std :: out_of_range。发生了

  11. 11

    Mini-Project.exe中0x77031D4D的未处理异常:Microsoft C ++异常:内存位置0x00CFF620的std :: out_of_range

  12. 12

    C ++ std :: out_of_range在内存位置

  13. 13

    抛出'std :: out_of_range'实例后调用终止

  14. 14

    抛出'std :: out_of_range'实例后调用终止

  15. 15

    使用gcc编译代码后,不会输出std :: out_of_range异常字符串

  16. 16

    以类型为std :: out_of_range的未捕获异常终止终止错误

  17. 17

    引发std :: out_of_range异常。“预期的类型说明符”

  18. 18

    使用gcc编译代码后,不会输出std :: out_of_range异常字符串

  19. 19

    0x742808F2 处未处理的异常:Microsoft C++ 异常:std::out_of_range 位于内存位置 0x0055E9E4

  20. 20

    抛出'std :: out_of_range'what():vector :: _ M_range_check实例后终止调用

  21. 21

    libc ++ abi.dylib:以类型为std :: out_of_range的未捕获异常终止:basic_string错误吗?

  22. 22

    设置QLineEdit时std :: out_of_range

  23. 23

    线程创建C ++ std :: thread抛出异常

  24. 24

    std :: stoi,std :: setbase和std :: out_of_range错误

  25. 25

    比较二进制数字输入的字符时,抛出'std :: out_of_range实例后调用终止

  26. 26

    将字母向前移动 3 个字母的程序,错误:在抛出 'std::out_of_range' 实例后调用终止

  27. 27

    在C中调试合并排序实现

  28. 28

    在混合C ++中捕获std异常和系统异常

  29. 29

    "if (argc < 2 || argc > 2)" 应该有 2 个参数吗?& 在抛出“std::out_of_range”错误实例后调用终止

热门标签

归档