为什么在合并排序中出现向量下标超出范围错误?
void merge(vector<int> dst,vector<int> first,vector<int> second)
{
int i=0,j=0;
while(i<first.size()&&j<second.size())
{
if(first[i]<second[j])
{
dst.push_back(first[i]);
i++;
}
else
{
dst.push_back(second[j]);
j++;
}
}
while(i<first.size()
dst.push_back(first[i++]);
while(j<second.size())
dst.push_back(second[j++]);
}
void mergeSort(vector<int> &a)
{
size_t sz = a.size();
cin.get();
if(sz>1)
{
vector<int> first(&a[0],&a[sz/2]);
vector<int> second(&a[(sz/2)+1],&a[sz-1]);
mergeSort(first);
mergeSort(second);
merge(a,first,second);
}
}
void MergeSort(int* a,size_t size)
{
vector<int> s(&a[0],&a[size-1]);
mergeSort(s);
}
有人可以帮我看看这段代码有什么问题吗?我收到向量下标超出范围错误。
void merge(vector<int> dst,vector<int> first,vector<int> second)
{
int i=0,j=0;
while(i<first.size()&&j<second.size())
{
if(first[i]<second[j])
{
dst.push_back(first[i]);
i++;
}
else
{
dst.push_back(second[j]);
j++;
}
}
while(i<first.size()
dst.push_back(first[i++]);
while(j<second.size())
dst.push_back(second[j++]);
}
void mergeSort(vector<int> &a)
{
size_t sz = a.size();
cin.get();
if(sz>1)
{
vector<int> first(&a[0],&a[sz/2]);
vector<int> second(&a[(sz/2)+1],&a[sz-1]);
mergeSort(first);
mergeSort(second);
merge(a,first,second);
}
}
void MergeSort(int* a,size_t size)
{
vector<int> s(&a[0],&a[size-1]);
mergeSort(s);
}
Can some one help me what is the problem with this code ? I am getting vector subscript outof range error.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您的子向量指定不正确。
请记住,迭代器指定从开始到结束。
所以这会错过向量中的中间元素和最后一个元素。
对于长度为 2 的非常短的向量也是未定义
想象一下,如果 a 是向量 { A, B, C, D}
或者尝试更大的向量: { A, B, C, D, E, F, G, H, I或者
尝试一个较小的向量: { A, B}
应该是:
传递到 merge() 的向量。 dst 参数必须通过引用传递,因为它是一个输出参数。但还要注意,第一个和第二个参数是 const,因此我们可以通过 const 引用传递(以避免复制步骤)。
还有合并功能:
将值推入 dst。但是 dst 从传入的数据中已经满了。因此,在我们进行合并之前,必须清除目的地。
Your sub vectors are specified incorrectly.
Remember the iterators specify the beginning to one past the end.
So this will misses the middle element and the last element in the vector.
And is also undefined for really short vectors of length 2
Imagine if a is the vector { A, B, C, D}
Or Try a bigger vector: { A, B, C, D, E, F, G, H, I}
Or Try a smaller vector: { A, B}
Should be:
The vectors passed into merge(). The dst parameter has to be passed by reference as it is an out parameter. But also note that first and second parameters are const so we can pass by const reference (to avoid the copy step).
Also the merge function:
Is pushing the value into dst. But dst is already full from the data that came in. So before we do the merge the destination must be cleared.
马丁是对的,问题是辅助向量的构造函数:
原始向量: 1 9 7 9 2 7 2 1 9 8
iter1: 2, iter2: 8
http://www.cppreference.com/wiki/stl/vector/vector_constructors
和谈论合并排序和其他排序算法,我发现了一个非常有用的网站:
http:// /www.sorting-algorithms.com/merge-sort
Martin is right, the problem is the contructor of the auxiliar vectors:
Original vector: 1 9 7 9 2 7 2 1 9 8
iter1: 2, iter2: 8
http://www.cppreference.com/wiki/stl/vector/vector_constructors
And talking about merge-sort and other sorting algorithms, I´ve found a very useful web:
http://www.sorting-algorithms.com/merge-sort
如果 sz == 2,
&a[(sz/2)+1]
将尝试获取 a[2] 的地址,这将给出此错误。If sz == 2,
&a[(sz/2)+1]
will try to take the address of a[2], which will give you this error.