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

Posted

技术标签:

【中文标题】合并排序算法中的 C++“以 std::out_of_range:vector 类型的未捕获异常终止”错误【英文标题】:C++ "terminating with uncaught exception of type std::out_of_range: vector" error in a merge sort algorithm 【发布时间】:2017-06-08 07:34:25 【问题描述】:

我有一个 c++ 代码,它应该使用归并排序算法对包含 800,000 多个单词的文件进行排序,每个单词都在新行上。

我做了什么?

首先,我尝试实现以下合并排序算法,并尝试在一小块输入上对其进行测试。我无法弄清楚向量的索引超出范围错误的位置。如果有人能帮我解决这个问题,我将不胜感激

#include <fstream>
#include <iostream>
#include <vector>

using namespace std;


vector<string> merge(const vector<string>& first,
                     const vector<string>& second) 
    // Write your code to merge vectors first and
    // second onto result.

    vector<string> output;
    int i = 0;
    int j = 0 ;
    int size_first = sizeof(first);
    int size_second = sizeof(second);

    while(i < size_first || j < size_second)
        if (i < size_first && j < size_second)
            if (first.at(i) < second.at(j))
                output.push_back(first.at(i));
                i++;
            
            else
                output.push_back(second.at(i));
                j++;
            
        
        else if (i < size_first)
            output.push_back(first.at(i));
            i++;
        
        else
            output.push_back(second.at(j));
            j++;
        

    
    return output;


void mergeSort(vector<string>& words) 
    if (words.size() <= 1)
    
        return;
    
    int n = words.size();
    int middle = n/2;

    vector<string> first_half(middle);
    for (int i = 0; i < middle; ++i) 
        first_half[i] = words[i];
    

    vector<string> second_half(n - middle);
    for (int i = middle; i < n; ++i) 
        second_half[i - middle] = words[i];
    

    words = merge(first_half, second_half);


void sort(vector<string>& words) 

    // Invoke mergeSort  here.
    mergeSort(words);


int main()

    vector<string> names;
    names.push_back("Smith");
    names.push_back("Abinash");
    names.push_back("Ciara");
    names.push_back("Reeta");

    sort(names);

    return 0;


【问题讨论】:

sizeof(first); 不会像您认为的那样做。此外,使用调试器和单步调试代码应该很容易解决您的问题。 【参考方案1】:

    std::vector 有一个size() 成员函数,它返回向量中元素的数量。 sizeof(first) 返回 object representation 类型的 std::vector&lt;string&gt; 的字节大小,这不是您需要的。

     int size_first = sizeof(first);
     int size_second = sizeof(second);
    

    应该替换为

     int size_first = first.size();
     int size_second = second.size();
    

    你有一个错字:

    else 
        output.push_back(second.at(i));
        j++;
    
    

    应该是

        ...
        output.push_back(second.at(j))
    

    还有一个。您忘记了主要的事情 - 在调用 merge 之前调用 mergeSort 获取零件。应该是:

    mergeSort(first_half);
    mergeSort(second_half);
    words = merge(first_half, second_half);
    

【讨论】:

【参考方案2】:

你确定向量的大小错误:

int size_first = sizeof(first);
int size_second = sizeof(second);

替换为

size_t size_first = first.size();
size_t size_second = second.size();

【讨论】:

以上是关于合并排序算法中的 C++“以 std::out_of_range:vector 类型的未捕获异常终止”错误的主要内容,如果未能解决你的问题,请参考以下文章

算法 合并排序 c++语言

排序算法的c++实现——归并排序

在 C++ 中合并范围

c_cpp C ++中的合并排序算法

C++ 八大排序之一-----快速排序

C++每日一练16.合并两个排序的链表