【问题标题】:MergeSort vectors using vector iterators使用向量迭代器合并排序向量
【发布时间】:2012-10-30 18:30:51
【问题描述】:

我需要实现 MergeSort 以使用向量迭代器对整数向量进行排序。 我实现了它,但我收到了这个错误:Vector iterator not dereferencable。

我使用 (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;
}

【问题讨论】:

标签: c++ sorting vector implementation mergesort


【解决方案1】:

迭代器范围应该表示为一个引用第一个元素的迭代器,以及一个引用 one-past-the-end 的迭代器。如果它们相等,则这是一个空范围。你没有这样做。

要解决这个问题,if(first+1==last) 子句应该返回。第二个mergesort(middle+1,last) 调用应该是mergesort(middle,last)pa 应该等于 middle-lastpb 计算正确。而且我认为应该删除最后一个 for 循环中的-1

将迭代器定义为 first 和 iterator to last 是一个坏主意。

【讨论】:

    【解决方案2】:

    你应该这样做

    mergesort(A.begin(),A.end()-1); 
    

    实际上,end() 迭代器指向一个元素向量的末尾。它不指向向量的 last 元素。

    【讨论】:

    • 不,你不应该那样做。遵循迭代器范围包含第一个元素的模式,以及一个指向过去的元素的迭代器。
    猜你喜欢
    • 2023-03-15
    • 2017-08-29
    • 1970-01-01
    • 2011-04-22
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多