使用向量迭代器的合并矢量
MergeSort vectors using vector iterators
我需要实现Mergesort使用向量迭代器对整数进行分类。我实现了它,但是我遇到了此错误:矢量迭代器不可用。
作为Mergesort函数i使用的参数(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;
}
迭代器范围应表示为迭代器,涉及第一个元素,而迭代器则指代一past-the-end。如果它们是相等的,那么这是一个空范围。你不是那样做。
要解决此问题,if(first+1==last)
子句应返回。第二个mergesort(middle+1,last)
呼叫应为mergesort(middle,last)
。pa
应仅等于middle-last
。pb
的计算正确。我认为最后一个循环中的-1
应该被删除。
将迭代器定义为首先定义的范围,而迭代器则是一个坏主意。
你应该做
mergesort(A.begin(),A.end()-1);
实际上, end()
迭代器指向之后的元素。它没有指向向量的元素。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 在C++中使用迭代器合并排序
- 提升::flat_set的迭代器无法合并
- 使用迭代器进行合并排序中的一个缓冲区
- 使用向量迭代器的合并矢量