字符串归并排序
Mergesort for strings
我是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>'
这个错误在说什么?我应该如何修改我的代码?
在错误消息中,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[]
元素,而不是对它们的副本进行排序然后将它们复制回来。
相关文章:
- 提高从排序字符串中获取字母顺序的顺序复杂性
- C 在向量的向量中按字母顺序排序字符串
- 在排序字符串向量中进行有效搜索
- C 选择排序字符串数组
- C 排序字符串的动态阵列 - 排序不起作用
- C++:使用 LSD 基数排序字符串排序崩溃
- 标准::排序 C 字符串的比较函数
- 使用最小运算将给定字符串转换为排序字符串
- C++ - 链表插入排序(字符串元素)
- 分段错误(核心转储)排序字符串数组错误
- 比较函数用于排序字符串的矢量(每个字符串都是一个数字)C++
- std::mutiset vs std::vector,用于读取排序字符串并将其写入文件
- 按字母顺序快速排序字符串矢量
- C++按字母顺序排序字符串
- c++中的数组和归并排序
- 按长度排序字符串数组
- 字符串归并排序
- 归并函数中动态数组的归并排序
- 递归归并排序传递指向零的指针
- Vector of struct (copy_n和归并排序)