4

我对 C++ 编程很陌生,最近写了一个合并排序方法来对一些数组进行排序。对于我的个人测试,它适用于整数和双精度数。但是当我尝试对字符串进行排序时,它给了我一个“语义问题”错误,我很困惑。完整的代码是:

#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>'

这个错误在说什么?我应该如何修改我的代码?

4

2 回答 2

6

你有一个可变长度数组:

T t[right-left+1];

这是您的特定编译器支持的扩展,而不是 C++ 标准的一部分。它不适用于复杂的对象类型,例如std::string- 因此出现错误消息。您可以将其替换为vector

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

不过,Basile 使用指针的想法更好 - 复制std::string对象非常重量级(即内存密集型,速度慢)......您只想跟踪a[]要移动的元素,而不是对它们的副本进行排序然后将它们复制回来。

于 2013-06-10T05:13:10.057 回答
6

在错误消息中,POD指的是普通旧数据类型

你可以使用其中std::vector的一个,即

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

您还可以创建t一个指针数组(即T* t[right-left+1];并相应地更新代码)。

顺便说一句,您使用的是可变长度数组,这是其他一些编译器不提供的GCC 扩展。

但排序在 C++ 标准库中可用。您需要在标准 C++ 容器上#include<algorithm>使用并使用std::sort 。

于 2013-06-10T05:12:04.020 回答