我需要使用向量迭代器实现MergeSort来对整数向量进行排序。 我实现了它但是我收到了这个错误:矢量迭代器不能解除引用。
作为mergesort函数的参数我使用(A.begin(),A.end())其中A是我的向量包含 n个元素。
#include <iostream>
#include <vector>
using namespace std;
void swap(vector<int>::iterator first,vector<int>::iterator last)
{
int temp;
temp=*first;
*first=*last;
*last=temp;
return;
}
void mergesort(vector<int>::iterator first,vector<int>::iterator last)
{
if(first==last) return;
if(first+1==last)
{
if(*last>*first) swap(first,last);
return;
}
vector<int>::iterator middle;
middle=first+(last-first)/2;
mergesort(first,middle);
mergesort(middle+1,last);
int a,b,pa,pb;
vector<int> h;
//the number of elements in a
pa=middle-first+1;
//the number of elements in b
pb=last-middle;
h.resize(pa+pb);
a=0; b=0;
while(a<pa && b<pb)
if(*(first+a)<*(middle+1+b))
{
h[a+b]=*(first+a); a++;
}
else
{
h[a+b]=*(middle+1+b); b++;
}
while(a<pa)
{
h[a+b]=*(first+a); a++;
}
while(b<pb)
{
h[a+b]=*(middle+1+b); b++;
}
for(int i=0;i<((a+b)-1);i++)
*(first+i)=h[i];
return;
}
int main(){
vector<int>A;
for(int i=1000;i>0;i--)
{
A.push_back(i);
//vector of integer: 1000,999,998 ... 3,2,1
}
mergesort(A.begin(),A.end());
//sort vector elements from smallest to biggest: 1,2,3...998,999,1000
system("pause");
return 0;
}
答案 0 :(得分:2)
Iterator范围应表示为引用第一个元素的迭代器,以及引用一个结尾的迭代器。如果它们相等,则这是一个空的范围。你不这样做。
要解决此问题,if(first+1==last)
子句应该返回。第二个mergesort(middle+1,last)
来电应为mergesort(middle,last)
。 pa
应该等于middle-last
。 pb
已正确计算。我认为应该删除最后一个for循环中的-1
。
将迭代器定义为第一个并将迭代器定义为最后的范围是一个坏主意。
答案 1 :(得分:1)
你应该做
mergesort(A.begin(),A.end()-1);
实际上,end()
迭代器在向量的末尾之后指向元素。它没有指向向量的 last 元素。