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

时间:2017-06-08 07:34:25

标签: c++ algorithm vector

我有一个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;

}

2 个答案:

答案 0 :(得分:2)

  1. std::vector有一个size()成员函数,它返回向量中的元素个数。 sizeof(first)返回std::vector<string>类型object representation的字节数,而这不是您需要的。

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

    应替换为

     int size_first = first.size();
     int size_second = second.size();
    
  2. 您输入了错字:

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

    应该是

        ...
        output.push_back(second.at(j))
    
  3. 另一个。你忘了主要的事情 - 在调用mergeSort之前调用merge部分。应该是:

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

答案 1 :(得分:2)

你确定错误的矢量大小:

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

将其替换为

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