合并排序算法中的 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<string>
的字节大小,这不是您需要的。
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 类型的未捕获异常终止”错误的主要内容,如果未能解决你的问题,请参考以下文章