向量下标超出范围 C++ 合并排序
Posted
技术标签:
【中文标题】向量下标超出范围 C++ 合并排序【英文标题】:Vector subscript out of range C++ merge sort 【发布时间】:2018-03-10 12:56:36 【问题描述】:我正在尝试在 c++ 中实现一个简单的合并排序,但我一直遇到这个错误:
我的代码:
void merge(vector<int> &data,int left,int mid,int right)
vector<int> L, R, v;
int i, j;
for (i = 0; i < mid - left + 1; i++)
L.push_back(v[left + i]);
for (j = 0; j < right - mid; j++)
R.push_back(v[mid + j + 1]);
i = j = 0;
int k = left;
while (i < L.size() && j < R.size())
if (L[i] < R[j])
v[k++] = L[i++];
else
v[k++] = R[j++];
while (i < L.size())
v[k++] = L[i++];
while (j < R.size())
v[k++] = R[j++];
vector<int>::const_iterator iter = v.begin();
for (; iter != v.end(); ++iter)
data[left++] = *iter;
void mergeSort(vector<int> &v, int left, int right)
if (left < right)
int mid = (left + right) / 2;
mergeSort(v, left, mid);
mergeSort(v, mid + 1, right);
merge(v, left, mid, right);
在 main 中调用:mergeSort(numbers,0,numbers.size());
,其中 numbers 是带有一些数字的向量。
如何解决这个断言失败,向量下标超出范围是什么意思?
【问题讨论】:
那是一个崩溃。您使用调试器来找出它在代码中发生的位置,并检查涉及的变量以确保它们看起来正常。所以先按“重试”按钮调试进入调试器。 也就是说,消息“向量下标超出范围”应该是对正在发生的事情的一个很大的暗示。 debugging your code. @Raul Marinau 错误的原因是函数合并的代码非常糟糕。糟糕的代码包含错误是编程规则。 @Raul Marinau 至少函数合并中有错别字。循环中必须有向量数据,而不是向量 v。 for (i = 0; i 【参考方案1】:糟糕的代码包含错误是编程法则。:)
对于初学者,您应该使用类型 std::vector<int>::size_type
而不是类型 int
。
函数merge中有错别字。很明显,在循环中必须使用向量 data
而不是向量 v
,因为向量 v
是空的。
void merge(vector<int> &data,int left,int mid,int right)
vector<int> L, R, v;
int i, j;
for (i = 0; i < mid - left + 1; i++)
L.push_back(v[left + i]);
for (j = 0; j < right - mid; j++)
R.push_back(v[mid + j + 1]);
在循环之后,向量元素的数量也比实际的元素数量大一。
考虑以下使用来自函数 merge
的循环的测试程序。
#include <iostream>
#include <vector>
void merge( std::vector<int> &data,
std::vector<int>::size_type left,
std::vector<int>::size_type mid,
std::vector<int>::size_type right )
std::vector<int> L, R;
for ( std::vector<int>::size_type i = 0; i < mid - left + 1; i++ )
L.push_back( data[left + i] );
for ( std::vector<int>::size_type j = 0; j < right - mid; j++ )
R.push_back( data[mid + j + 1]);
std::cout << L.size() << '\t' << R.size() << std::endl;
void mergeSort( std::vector<int> &v,
std::vector<int>::size_type left,
std::vector<int>::size_type right )
if ( left < right )
auto mid = ( left + right ) / 2;
merge( v, left, mid, right );
int main()
std::vector<int> v( 1, 2 );
mergeSort( v, 0, v.size() );
return 0;
它的输出是
2 1
虽然原始向量 v
仅包含 2
元素。
【讨论】:
以上是关于向量下标超出范围 C++ 合并排序的主要内容,如果未能解决你的问题,请参考以下文章