我必须实现一个shuffleString(string s,int d)
方法,其中第一步涉及获取字符串中每个字符的计数,并按照其计数的递减顺序排列它们。我实现了如下所需的功能:
struct node{
char ch;
int ctr;
};
bool myfunc(const struct node x,const struct node y){
return (x.ctr>=y.ctr?true:false);
}
string shuffleString(string s,int d){
int i,j;
int len=s.size();
vector<struct node> counter(26);
for(i=0;i<26;i++){
counter[i].ch='a'+i;
counter[i].ctr=0;
}
for(i=0;i<len;i++){
counter[s[i]-'a'].ctr++;
}
sort(counter.begin(),counter.end(),myfunc);//From STL's algorithm
/*
Remaining Functionality
*/
}
但是,在调用segmentation fault
方法时,代码会生成sort()
。我的代码出了什么问题?请帮忙。
P.S。该字符串仅包含小写ASCII字符。
答案 0 :(得分:0)
你可能在行中有内存损坏:counter [s [i] - 'a']。ctr ++;
s [i] - 'a'可以超过25,超出矢量边界。
答案 1 :(得分:0)
stl sort默认使用operator<
- 它希望你传入的函数的行为方式相同。
这意味着如果它在两个相同的值上调用函数,它应该变为false,但在你的情况下它会变为真。因此,它将无法正确排序。
当您删除=该功能时,由于operator>
不具有反身性,operator <
如果使用debug c运行时运行,STL将首先声明传入的函数格式正确。
答案 2 :(得分:0)
试试这个
bool myfunc(const struct node x,const struct node y){
return (x.ctr>y.ctr) || (x.ctr == y.ctr && x.ch < y.ch);
}
已编辑:
>
和==
个案而不是>=
)a-z
以外的任何字符时,您的算法将失败(偶数A-Z
)这里有一个小片段:
struct node{
char ch;
int ctr;
};
bool myfunc(const struct node x,const struct node y){
return (x.ctr>y.ctr) || (x.ctr == y.ctr && x.ch < y.ch);
}
void shuffleString(string s){
int i,j;
int len=s.size();
vector<struct node> counter(26);
for(i=0;i<26;i++){
counter[i].ch='a'+i;
counter[i].ctr=0;
}
for(i=0;i<len;i++){
counter[s[i]-'a'].ctr++;
}
for(int i=0; i<26;i++) cout << counter[i].ch <<"," << counter[i].ctr << endl;
cout << endl << endl;
sort(counter.begin(),counter.end(), myfunc);//From STL's algorithm
for(int i=0; i<26;i++) cout << counter[i].ch <<"," << counter[i].ctr << endl;
}
int main()
{
shuffleString("hello");
return 0;
}