簡體   English   中英

用於字符串的Mergesort

[英]Mergesort for strings

我是C ++編程的新手,最近寫了一個mergesort方法來排序一些數組。 對於我的個人測試,它適用於整數和雙精度。 但是當我嘗試對字符串進行排序時,它會給我一個“語義問題”錯誤,我很困惑。 完整的代碼是:

#include <iostream>
#include <string>
using namespace std;

template<typename T>
class Sorting{
public:
static void merge(T* a, int left, int mid, int right){
    int i=left; int j=mid+1; int k=0;
    T t[right-left+1]; //****************ERROR LINE

    for(;i<=mid && j<=right;k++){
        if(*(a+i)<=*(a+j)){
            t[k]=a[i];
            i++;
        }
        else{
            t[k]=a[j];
            j++;
        }
    }

    for(;i<=mid;i++,k++) t[k]=a[i];

    for(;j<=right;j++,k++) t[k]=a[j];

    for(i=0;i<k;i++) a[left+i]=t[i];
}

//Mergesort top-level function. Left is starting index, right is ending index
static void mergesort(T* a, int left, int right){
    if(left>=right) return;
    int mid=left+((right-left)>>1);
    mergesort(a, left, mid);
    mergesort(a, mid+1, right);
    merge(a, left, mid, right);
}
};


int main(){
const int len=5; 
string ss[len]={
    "Yep",
    "Nope",
    "5",
    "2.5",
    "Stackoverflow"
};
double ar[len]={4.2, 3, 5.6, -15, 0};

Sorting<double>::mergesort(ar, 0, 4); for(int i=0; i<len;i++) cout<<ar[i]<<endl;
Sorting<string>::mergesort(ss, 0, 4); for(int i=0; i<len;i++) cout<<ss[i]<<endl;
return 0;
}

我在“// * * ERROR LINE”上遇到語義錯誤,如:

Variable length array of non-POD element type 'std::__1::basic_string<char>'

這個錯誤在談論什么? 我應該如何修改我的代碼?

在錯誤消息中, POD指的是普通舊數據類型

你可以使用它們的std::vector ,即

   std::vector<T> t;
   t.resize (right-left+1);

你也可以使t指針數組(即T* t[right-left+1];並相應地更新代碼)。

順便說一句,您使用的是可變長度數組,這是其他一些編譯器不提供的GCC擴展

但是在C ++標准庫中可以進行排序。 您需要#include<algorithm>並在標准C ++容器上使用std :: sort

你有一個可變長度數組:

T t[right-left+1];

這是您的特定編譯器支持的擴展,而不是C ++標准的一部分。 它不適用於像std::string這樣的復雜對象類型 - 因此出現錯誤消息。 你可以用vector替換它:

std::vector<T> t(right - left + 1);

Basile使用指針的想法更好 - 復制std::string對象非常重量級(即內存密集,速度慢)...你只想跟蹤哪些a[]元素移動,而不是對它們的副本進行排序然后將它們復制回來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM